最新学习了Redis的分布式锁相关的知识,一来为了加深记忆,二来顺便分享一下,锻炼一下自己的表达能力。所以就把学习的内容记录一下。 如果想直接看最终优化完的代码,可以直接看文章最后的代码即可。 前言 本文章中使用的redis连接工具是spring-boot-starter-data-redis中提供的StringRedisTemplate。 redisson使用的是redisson-spring-boot-starter中提供的Redisson。 基础业务逻辑 在一个高并发的商城系统中,为防止我们一般会把一个商品的…

2021年4月22日 0条评论 37点热度 阅读全文

参考《Redis设计与实现》 一、什么是SDS Redis是使用C语言进行编写,大家都知道C语言对于字符串有自己的字符类型char[],但是Redis并没有采用C语言自带的字符类型,而是自己构建了动态字符串的抽象类型 在github上下载到Redis的源码,查看sds.h文件,发现了如下定义 struct __attribute__ ((__packed__)) sdshdr5 { unsigned char flags; /* 3 lsb of type, and 5 msb of string length *…

2021年4月21日 0条评论 35点热度 阅读全文

Q:你们redis怎么做的分布式 A:我们公司redis用的murmurHash做的分片; Q:讲讲murmurHash的原理呗 A:额……这块没有深入了解过(真TM掉分) 哈希算法简单来说就是将一个元素映射成另一个元素,可以简单分类两类, 加密哈希,如MD5,SHA256等, 非加密哈希,如MurMurHash,CRC32,DJB等。 这里说说Jedis中的Shard是如何使用一致性hash的 首先是hash函数,在Jedis中有两种Hash算法可供选择,分别是MurMurHash和MD5. 按照Jedis的说法…

2021年4月20日 0条评论 35点热度 阅读全文

简单理解 关于缓存击穿的问题其实也很简单,就是一个热点数据,我们肯定会把它放在缓存里面,但是如果在流量的高峰期,这个热点数据突然过期了,那岂不是全部的流量都要打到数据库上,那缓存就形同虚设,数据库可能先报警一下,然后挂掉.其实这个问题我觉得是在实际问题中很常见,也应该在流量的高峰期提前做好准备的,比如双十一,那天的流量的大小就不用我描述有多恐怖了,如果这个时候热点数据在缓存中过期了,那对数据库造成的伤害… 解决方案 1、设置热点Key,自动检测热点Key,将热点Key的过期时间加大或者设置为永不过期,或者设置为逻辑…

2021年4月20日 0条评论 36点热度 阅读全文

redis作为分布式锁 redis的应用场景。 采用Redis的官方推荐的Redisson作为redis的分布式锁 第一种版本锁场景: 第二种版本使用StringRedisTemplate进行操作 第三种版本使用第三方组件redisson-----专门用于解决分布式问题。 引入依赖 redis重点面试题 redis的面试题。 redis的应用场景。 (1)作为缓存 (2)分布式锁 今天就来介绍分布式锁的使用场景。 采用Redis的官方推荐的Redisson作为redis的分布式锁 用redis实现分布式锁,解决高并…

2021年4月20日 0条评论 38点热度 阅读全文

退出redis shutdown :关闭redis exit :推出 keys * :查看全部的key linux启动redis redis的路径:/usr/local/bin 启动redis服务器: redis-server 85config/redis.conf 启动redis客户端:redis-cli -p 6379 ping 之后返回 pong 查看redis线程:ps -ef|grep redis ============================== Redis五种基本类型 String 字符串 …

2021年4月19日 0条评论 37点热度 阅读全文

首先,导入jedis依赖,springboot内置了jedis,所以无需指定jedis版本 <!--jedis依赖 使用redis--> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> redis相关环境: redis-5.0.0 redis客户端:redis-desktop-manager-0.8.…

2021年4月19日 0条评论 28点热度 阅读全文

结构定义 // hash表结构,每个字典采用两个哈希表,实现渐进式rehash typedef struct dictht { // 哈希表数组,每个元素一条链表 dictEntry **table; unsigned long size; unsigned long sizemask; unsigned long used; } dictht; typedef struct dictEntry { void *key; union { void *val; uint64_t u64; int64_t s64; d…

2021年4月18日 0条评论 36点热度 阅读全文

一、场景举例 我们日常上网冲浪的时候,常常会遇到这样的情景: 多次输错登陆密码,再次尝试登录,页面提示需要输入正确的图形验证码 某内容平台限定,每个账号单日可发布的文章数量不得超过规定上限 采用短信验证码进行交互的场景,M分钟内请求的验证码次数过多,接下来的N分钟里会被拒绝请求,并提示"用户操作频繁,请稍后再试" 当网站的访问量突然很大的时候肯定会对服务器造成影响,甚至无法访问,如果是正常的访问那么很好说明业务量增大可以考虑系统的拓展,但是如果是搜索引擎爬虫频繁访问或是一些恶意访问,那这时候我们就应该限制这些访问的…

2021年4月18日 0条评论 36点热度 阅读全文

redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)里,数据保存到硬盘的过程就叫做持久化。 1.快照持久化(snap shotting) 该持久化默认开启,一次性把redis中全部的数据保存存储在硬盘中,如果数据非常多(10-20G)就不适合频繁该持久化操作 (1)快照持久化保留在本地硬盘的数据库备份文件:dump.rdb (2)快照持久化备份的频率, save 900 1 #900秒内如果超过1个key被修改,就发起快照保存 sav…

2021年4月17日 0条评论 37点热度 阅读全文