redis
liyunlong41
你必须非常努力,才能看起来毫不费力。
展开
-
redis过期策略
最近在读redis深度历险,记录一下在读书的过程中一些重要的知识点,供以后查阅。redis过期策略有两种,一种是主动式过期,另一种是被动式过期,redis采用两者相结合的方式来处理,因为单纯采用主动式过期,会影响redis的性能,单纯采用被动式过期,可能会导致大量内存得不到释放。主动式过期: redis会将所有设置了过期时间的key放到一个独立的字典中,以后会定时扫描这个字典,将...原创 2019-01-29 12:46:14 · 29903 阅读 · 0 评论 -
redis基础数据结构以及其应用
最近在看redis相关的书籍,这里将一些知识点做下总结,以免以后遗忘。主要包含redis基础数据结构、redis的一些策略以及redis的一些应用等内容。String实现redis的字符串是简单动态字符串,可以对其进行动态修改。策略空间预分配当对字符串进行append操作时,如果修改后的字符串长度len小于1MB,那么redis会分配跟len大小相等的fr...原创 2019-05-04 18:42:52 · 236 阅读 · 0 评论 -
golang使用redis实现分布式锁
redis可以使用string数据结构来实现分布式锁。这里记录一些注意点:setnx:利用setnx的特性,当key不存在时,可以设置成功;当key存在时,setnx返回nil。 设置expire:为了防止客户端获取到锁后忘记解锁,这里设置了锁的过期时间。并且由redis来保证setnx和expire是原子操作,否则可能出现在setnx后可能未设置expire的情况。 超时问题:由于设置了...原创 2019-05-04 20:54:02 · 5834 阅读 · 2 评论 -
golang利用redis实现限速器
利用redis的String数据结构可以实现计数器的功能,利用incr或者incrby来实现计数器的增加或者减少。同时redis对可以对key实现过期功能,这样我们就可以利用计数器和过期功能来实现限速器。例如很多时候我们需要对单个用户进行限速,每分钟或每秒钟限制limit次,可以使用user_id作为key,访问次数作为value,到redis进行存储,当用户访问一次,我们就incr一下;...原创 2019-05-05 21:11:21 · 2408 阅读 · 0 评论 -
golang利用redis实现消息队列Push和Pop
可以利用redis的list结构来实现消息队列功能,使用lpush、rpush来实现入队,lpop、rpop来实现出队列。我们统一从左边push、从右边pop,即用lpush和rpop组合。当list中没有元素时,rpop会返回nil,这样我们需要不断用轮询队列,直到队列中有元素,然后pop出来。为了避免不断轮询带来的性能损耗,我们这里使用brpop命令,brpop使用了系统提供的阻塞...原创 2019-05-08 18:22:16 · 6940 阅读 · 0 评论 -
golang利用redis实现简单延时队列
redis的zset是一种能自动排序的数据结构,我们可以用这个特性来实现简单的延时队列。利用zadd将数据添加到zset中,每个数据的score值设置为数据的延时时间+当前时间戳,后台goroutine不断zrange轮询zset,取出score值小于当前时间戳的数据,然后再对数据进一步处理,这样就实现了简单延时队列的功能。Zaddzadd支持批量添加的功能,有需要可以自己去探索下,这里...原创 2019-05-08 19:45:57 · 2637 阅读 · 0 评论