- redis是单线程的,内部是有队列来顺序执行命令的。qps 大约是10w/s.
速度快的原因:基于内存,所有数据都在内存中运算;避免了多线程之前切换的性能消耗。 - 对象存储。我们可以通过
set key value 将对象序列化成json对象【注意:s t r对象不能太大;如果频繁获取以及修改对象值,则效率降低】
mset key value:如学生id=1,则 mset stu:1:name niuyp stu:1:age 28;
hmset key 则可以维护整个表:如 hmset stu stu:1:name niuyp stu:1:age 28; - 分布式锁:setnx 不存在则返回成功=1;存在返回失败=0
- 计数器 :incr key 返回计算的最终结果。
- websession 共享
- 分布式系统全局序列号:数据库的主键可以通过incrby以及雪花算法来实现。之所以不使用incr 是因为一次一次的获取,效率过滤地下,所以我么提倡批量生成id,供某一模块缓存并使用。如果重启,则重新获取即可。
- Hash使用场景:如购物车
7.1 :添加商品:hset cart:用户id 商品id 1
7.2: 增加商品:hincrby cart:用户id 商品id 1
7.3: 商品总数:hlen cart:用户id
7.4: 删除商品:hdel cart:用户id 商品id
7.4: 获取所有:hgetall cart:用户id - List 结构:blpop key timeout:从集合表头弹出一个元素,如果列表为空,则阻塞等待 timeout 秒,如果timeout=0,则无限等待。
应用场景:微博消息和微信公众号的消息列表:lpush + lrange 组合展示消息列表 - set使用场景:
1、微信抽奖小程序【1、点击参与 sadd goods userid. 2、查看参与者 smembers goods.
3、抽取5名。srandmember goods 5 (从集合key中获取n个元素,但是元素不会从集合中删除。)】
2、点赞、标签功能
3、关注模型,比如你关注的人还关注了谁谁谁 (sinter,sunion,sdiff) sdiff key1 key2 key3 [key1减去key2和key3的集合,key1所留下的结果]
4、电商商品筛选 - zset 使用场景:
排行榜:
1、点击新闻预览 则+1,zincrby 1 new:20200913
2、列出前10: zrevrange new:20200913 0 9 withscores. (根据分值倒序列出,并展示分值)
3、7日搜素:zunionstore new20200907-20200913 7 new:20200907...new:20200913
并集计算:zunionstore destkey numberkeys key[key...]
交集计算:zinterstore destkey numberkeys key[key...] - redis既然是单线程的,为什么连接多个客户端,也没觉得慢?
答:采用epoll模型的io多路复用 - keys命令如果键值很多时效率很低,代替方案使用 scan 0 match key99* count 1000(从下表0开始,扫描以key99开头的所有键值,扫描1000个键值)--》返回匹配的个数 以及 具体的key值
- redis持久化分为两种
rdf快照模式:dump.rdb ,该文件内容是被压缩过的二进制文件,通过配置 save 60 1000 方式启动,即:如果60秒内有1000个键值发生变化,则生成一次快照。该动作等价于手动执行bgsave (redis 会fork一个子进程) 缺点:如果60秒只修改999个键,那么这999个键会丢失。
aof文件追加方式:该方式存储的是 操作指令,配以配置为 always(执行一次命令存一次),everysec(每秒存一次),no(永远不存储)。为了防止有大量这种自增操作,redis提供了 aof重写功能。 ,即重复命令只取最后的结果,多条记录合成一条(该动作会影响性能,而且需要配置文件大小达到多少M时触发。等价于bgrewriteaof,此时fork一个子进程) -
redis是c语言实现的,通过sds数据结构(simple dynamic string,有len标记要读取的长度,是二进制安全的数据结构;提供了内存预分配,避免了频繁的内容分配;兼容c语言的函数库,末尾默认添加了\0),而非原始的字符数组来实现(原始的以"\0" 来作为结尾)
redis所有的键都是string类型的,即使设置的是int或者double
redis 存储数据方式 数组+链表, 数组通过对key进行hash获取数组下标。扩容时,采用渐进式rehash ,当在扩容 且有访问某个key时,则进行迁移一部分(包含访问的key);如果长时间没有访问,内部线程定时也会进行搬移的
sds扩容机制:如果扩容到1M,则不再成倍扩容,每次加1M
数据结构:redis3.2以前
sds
1.free=0
2.len =3
char buf[]="aaa" --> aaabbbccc
扩容(len+addlen)*2 = (3+6)*2=18
则:
1.free=9
2.len=9
int类型几乎代表42亿,但是结构中字符长度用不到这么大空间,浪费,所以3.2版本以后,通过长度,自定义类型 5中(5,8,16,32,64)
buf,len,alloc,flags(前3个bit位代表类型,后5个bit位代表长度),alloc-len=free
Redis心得-01
最新推荐文章于 2025-05-03 09:23:35 发布