redis
阿飞Sirx
追求自我,超越自我
展开
-
Redis分布式锁的超时问题
Redis的分布式锁并不能解决超时问题,如果在加锁和释放锁之间的逻辑执行得太长,以至于超出了锁的超时限制,就会出现问题,因为这时候第一个线程持有的锁过期了,临界区的逻辑还没有执行完,而同时第二个线程就提前持有了这把锁,导致临界区代码不能得到严格串行执行为了避免这个问题,分布式锁不要用于较长时间的任务,如果真的偶尔出现了问题,造成的数据小错乱,可能需要人工介入解决有一个稍微安全一点的方案,是将set指令的value参数设置为一个随机数,释放锁时先匹配随机数是否一致,然后在删除key,这是为了确保当前线程占原创 2021-11-13 15:43:54 · 2953 阅读 · 0 评论 -
Redis每秒执行多少次指令
这个信息在Stats块儿里,可以通过 info stats指令看到redis-cli: info stats|grep opsinstantaneous_ops_per_sec:789以上表示ops是789,也就是客户端每秒会发送789条指令到服务器执行,在极限情况下,redis可以执行每秒十万次指令,cpu完全被榨干,如果ops过高,可以通过monitor指令,快速观察一下究竟哪些key被访问的比较频繁,从而在相应的业务上进行优化,减少io次数,monitor指令会瞬间吐出巨量的指令文本,一般在执原创 2021-11-09 19:28:53 · 2345 阅读 · 0 评论 -
Jedis事务操作用例
public class TransactionDemo{ public static void main(String[] args){ Jedis jedis = new Jedis(); String userId = “testId”; String key = keyFor(userId); jedis.setnx(key,String.valueOf(5)); System.out.println(doubleAccount(jedis,user原创 2021-11-03 20:24:53 · 107 阅读 · 0 评论 -
Redis做简单限流
限流算法是分布式领域一个经常被提起的话题,当系统的处理能力有限的时候,如何阻止计划外的请求对系统加压,需要考虑除了控制流量,还有一个应用就是控制用户行为,避免垃圾请求Redis简单限流规定某个请求在规定的时间里,只允许发生N次,可以考虑使用zset的score值,圈出一个时间窗口,保留窗口内的数据,其他的去掉,其value值只需要保证唯一即可,public class SimpleRateLimiter{ private Jedis jedis; public SimpleRateLim原创 2021-10-27 20:26:49 · 65 阅读 · 0 评论 -
Redis数据结构之list
redis列表相当于java语言里面的LinkedList,是链表而不是数组,这意味着list的插入和删除操作非常快,时间复杂度o(1),但是索引定位很慢,时间复杂度为o(n),列表中每个元素使用双向指针顺序,支持前向后向遍历当列表弹出最后一个元素之后,数据结构自动删除,内存被回收redis列表list常用来做异步队列使用,将需要延后处理的任务结构体序列化成字符串,塞进redis列表,另一个线程从这个列表中轮训数据进行处理1.list结构的常用指令队列:rpush key value1 value原创 2021-10-24 11:26:09 · 1367 阅读 · 0 评论 -
Redis可重入锁java实现
可重入性是指线程在持有锁的情况下再次请求加锁,如果一个锁支持同一个线程的多次加锁,那么这个锁就是可重入的,redis分布式锁如果要支持可重入,需要对客户端的set方法进行包装,使用线程的ThreadLocal变量存储当前持有锁的计数public class RedisWithReentrantLock{ private ThreadLocal<Map<String,Integer>> lockers = new ThreadLocal<>(); private原创 2021-10-23 19:03:07 · 291 阅读 · 0 评论 -
Redis数据结构之String
Redis有五种数据结构分别为string,list,hash,set,zset字符串string是redis最简单的数据结构,内部表示就是一个字符数组,redis所有的数据结构都以唯一的key字符串作为名称,然后通过这个唯一的key值来获取相应的value值,不同的数据结构的差异就在于value值的结构不一样字符串的使用非常广泛,一个常见的用途就是缓存用户信息,我们将用户信息结构体使用json序列化成字符串,然后将序列化后的字符串塞进redis来缓存,同样,获取用户信息会经过一次饭序列化过程redi原创 2021-10-23 18:18:26 · 393 阅读 · 0 评论 -
redis安装
redis需要使用linux或者Mac环境redis的安装方式主要有以下三种1.使用docker安装2.通过github源码编译3.直接安装apt-get install(ubuntu) yum install(RedHat) brew install(Mac)Docker方式:#拉取redis镜像docker pull redis#运行redis容器docker run --name myredis -d -p6379:6379 redis#执行容器中的 redis-clidock原创 2021-10-19 20:02:46 · 59 阅读 · 0 评论 -
Redis可以做什么
redis用途很广泛,可以用在很多地方1.记录帖子的点赞数,评论数和点击数hash2.记录用户的帖子id列表并排序,便于快速显示用户的帖子列表zset3.记录帖子的标题,摘要,作者和封面信息,用于列表显示hash4.记录帖子的点赞用户id列表,评论id列表,用于显示和去重计数zset5.缓存近期热帖内容,帖子内容的空间占用比较大,减少数据库压力6.记录帖子的相关文章id. list7.如果帖子id是整数自增的,可以使用redis来分配帖子id(计数器)8.收藏集和帖子之间的关系zset9.原创 2021-10-18 20:02:05 · 860 阅读 · 1 评论