`

知识积累-redis使用

阅读更多

需求:网站对登陆的手机号,发短信的次数进行限制(比如说10次),时间限制1天。

 

想法:redis记录次数(Memcached也可以,但是基于项目中本来已有redis的客户端,就不想费事使用Memcached)

 

设计:key=“XXX_手机号” ,value="次数",过期用redis客户端带的过期的方法

 

环境:JQuery+SpringMVC+redis(redis 用的是非集群),

           redis客户端用的是ShardedJedis


问题:使用客户端设置的过期时间各种不起效,如下几种方式

//key,seconds,value
jedis.setex("name",30,"xiaohua");
//key,seconds
jedis.expire("name",20);
//key,value,xx,EX = seconds; PX = milliseconds,过期时间
jedis.set("name","xiaohua","XX","EX",60l);
//key,seconds,value
jedis.setex("name",30,"xiaohua");

 解决思路:用linux上的redis-cli的命令看看设置过期时间是否有效,用到的命令如下:

 

 

x.x.x.x 上有redis客户端。                   --(x.x.x.xredis客户端所在机器) 
cd /app/redis/bin/
./redis-cli -c -h D.D.D.D -p 6379       --(D.D.D.Dredis服务器) 

 实际操作命令如下:

 

 

 

命令解释:ttl key (以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)

1.当前key没有设置过期时间,所以会返回-1.
2.当前key有设置过期时间,而且key已经过期,所以会返回-2.
3.当前key有设置过期时间,且key还没有过期,故会返回key的正常剩余时间.

 

所以按照这个解释的话,返回0肯定是不对的,有时候也返回-1,但是也不对,应该返回-2的,过期了key肯定要不在的。所以问题出在哪??

 

找了另外一个组的redis,看了他们的过期时间的使用,跟我的一样,所以肯定不是代码问题,我就用redis-cli连他们的机器,同样执行上面的操作,结果如图:



 

同样的操作,这个redis的服务器就可以,说明是机器的事情,然后我就找专门负责redis机器的同事看了下,我一直以为是redis安装的问题,但是最后才发现,其实不是,问题的根源在于,我的用的是redis的非集群,而另外一组的同事的用的是集群的redis。查了谷歌发现有如下描述

 



 

查看下我使用的redis的服务器如下图:



 

 

其中slaveof的意思如下:

对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。
利用『 SLAVEOF NO ONE 不会丢弃同步所得数据集』这个特性,可以在主服务器失败的时候,将从属服务器用作新的主服务器,从而实现无间断运行。

 

几经周折,终于问题得到定位,那么回归到我本身的需求来说,本来是想通过redis客户端自身的设置过期的时间来做1天的限定的,现在不可能为了这个而去吧redis的服务器部署方式给改了,所以只得另想办法。

 



策略:key依然不变,但是value的更改下设计,原来放的是一个单纯的数字,记录的次数,现在改成一个对象(当然存放到redis中我肯定会序列化成json格式的字符串的),对象里面有两个字段(时间和次数,其中时间精确到天就可以了),要这个时间字段的用处是我每次根据key取redis数据的时候,获取的对象的时间和当前的时间做对比,如果是同一天就说明没过期,然后只用次数+1就可以了,如果不是同一天说明已经过期了,然后直接更新这个对象的时间和初始化次数,然后重新放入redis就可以了。

 

 

总结:一开始一直想着是服务器的问题,要从服务器角度出发,但是最终想到解决办法的时候,又觉得自己过于死板,客户端解决不了的问题,完全可以自己用代码去设计然后解决。所以以后在使用和设计上应该多些自己的想法......

 

 

 

 

 

 

~~~~~~~~纯个人项目遇到的问题总结,如能帮上您,我很开心,如有错误或者不严谨的地方,还望指教!~~~

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 39.8 KB
  • 大小: 46.1 KB
  • 大小: 43.4 KB
  • 大小: 20.7 KB
  • 大小: 27.4 KB
分享到:
评论

相关推荐

    java8集合源码分析-JavaArchitect:「Java架构师知识积累」

    基础知识 对 Java 后台技术发展有更深的认识。 常用框架 网络 操作系统 数据结构与算法 数据结构 算法 。 系统架构 MySQL 、 Redis Netty ZooKeeper 安全 认证授权 JWT JSON Web Token是一种身份认证的方式,JWT ...

    java8源码-Blog:个人博客,知识积累!

    《Redis入门指南》(第2版) 《Redis实战》 《从Paxos到Zookeeper分布式一致性原理与实践》 《Kafka技术内幕:图文详解Kafka源码设计与实现》 《MySQL技术内幕:InnoDB存储引擎》(第2版) 关注 (推荐指数:★★★...

    leetcode中国-Coding:编程知识笔记,Keepgoing~

    而这个仓库,是本人平日学习,积累,或者疑惑之后突然找到答案,或者总结对比,积攒的知识点,只要还在技术行业,就会一直更新。说不上是面试知识总结,更说不上是教别人什么,最重要的是知我所知,知我所不知。 种...

    java简易版开心农场源码--:个人代码积累

    个人代码积累 框架篇——工欲善其事,必先利其器 如果说运维是地基,那么框架就是承重墙。农村建住房是一块砖一块砖地往上垒,而城市建大House则是先打地基,再建承重墙,最后才是垒砖,所以中间件的搭建和引进是...

    Java 面试题积累.zip

    Java前后开发面试题,大厂进阶之路,基于JavaGuide、Cyc大佬、牛客...包含计算机网络知识、JavaSE、JVM、Spring、Springboot、SpringCloud、Mybatis、多线程并发、netty、MySQL、MongoDB、Elasticsearch、Redis、HBASE

    java后端源码部署-JavaTutorial:Java教程:基础、中级、高级;常用的工具和Servlet容器使用说明

    但经过一段时间后,这些知识点和技术又忘得差不多了,等到要用的时候又要搜索很多的资料从头到尾学习一次,浪费很多的时间,没有沉淀和积累。 在这里,通过文章和代码,把这些知识点和技术的主要内容记录并汇总,供...

    leetcode2-Awesome-Data-Engineering-Content:分享有趣和值得注意的数据工程内容

    leetcode 2 分享有趣且值得注意的数据工程内容 - 即博客、播客、存储库、书籍、视频和 MOOC。 这主要是由我们的研究员伊戈尔·巴里诺夫 (Igor Barinov) 策划并为他们策划的,并...中数据建模的基础知识 HBase 图数据库

    java8集合源码分析-javaLearner:java学习者

    本项目主打Java基础、算法、框架实战、源码、中间件、大数据、面试等知识积累和经验总结。文章共300多篇, 大部分为原创, 部分翻译和转载已标明出处。 谢谢大家的支持, 转载请标明出处, 谢谢。 感兴趣的朋友可以加入...

    leetcode中国-dubin-learner.github.io:dubin-learner.github.io

    leetcode中国 关于我 在硬件公司工作的软件工程师...最后提到了Redis源码的学习方法,推荐书籍《Redis实战》。 设计模式:优化代码设计,需要一定的经验积累。里面提到的有不同设计模式的各种语言实现,值得一看。 操作

    专访QQ大数据团队,谈分布式计算系统开发

    他们前身是QQ成立之初后台3个基础团队之一的QQ运营组,当下致力于腾讯内部的分析系统,在离线及交互式计算系统上积累了大量经验,更是面向应用的数据解决方案ADs的作者。NoSQL是笔者最早接触大数据领域的相关知识,...

Global site tag (gtag.js) - Google Analytics