Fork me on GitHub

redis常用命令

redis常用命令

expire key second
应用场景:

  • 限时的相关的业务
  • 网站数据缓存
  • 手机验证码
  • 限制web访客的限制次数
    redis 分配默认是预分配冗余空间的,例如len是字符串长度,实际分配为大于len ,字符串小于1m时候扩容是加倍空间,大于1m时候扩容是增加1m,最多存储512m .
    最佳实践 项目中对key进行命名统一规范 user:name 或者 user:1:lucky user:2: lee

String 类型

set key value
setnx key value
get key value
getset key value
strlen key
incr key value
incrby key value
decr key value
decrby key value
setex key value 设置key 并过期时间为秒
psetex key value设置key 并过期时间为毫秒
mset key value1 key2 value2
mget key key2

应用场景 
  1. 存储json字符串或者图片,因为string是二进制安全的不存在解码问题
    1. 计数器
    2. incr 是原子性的操作,能保证多线程并发问题

list

list 数据常用分页

start = pageNum-1pageSize end = pageSize pageNum -1 totoal = list.llen 命令,对应的就是KEY.SIZE方法
rpush books java python go
lpop books
rpop books
llen books
慢操作
lindex books 1
lrange books 0 -1
ltrim books 0 1 保留区间值
数据量小的时采用ziplist 压缩列表进行存储,数据量大时候使用quick list 即 zplist 组成的链表

hash 类型 特别像我们java程序中的Bean

数据结构和java的hashmap 一样,无序字典。不同于java的是使用渐进rehash,在后续hash操作或者定时任务时候慢慢迁移到新的hash上。Hash 最后一个元素删除进行内存的回收

1
2
3
4
5
6
7
8
9
10
11
hset books java "java"
hset books python "python"
#获取所有元素
hgetall books
hlen books
# 批量 set
hmset books java "effective java" python "learning python" golang "modern golang programming"
hget key field
#hincrby 或者hincr 与字符串操作一致
hexist key field 存在返回1 ,不存在返回0
删除直接用del key 命令快速简单

set集合

无序唯一的字典,它所有的value都是null
底层是inset 和hashtable 结构
sadd member
smembers 返回集合所有元素
sismember 查询某个key是否存在
scard books 获取长度相当于 count()
srem key member1 member1 删除集合中一个或多个元素
spop key count 删除并返回集合中N随机元素 抽奖场景
smove source destination member 移动数据到另外的集合
sdiff 差集
sinter 交集
sunion 并集
sdiffstore destination key key 把结果存在集合中

zset有序集合

Java 的 SortedSet 和 HashMap 的结合体,给每一个value都赋予一个score ,代表这个value的排序权重,它的内部实现用的是一种叫做「跳跃列表」的数据结构。想想自己身处的地域 黑龙江-哈尔滨-阿城区-延川大街

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
zadd  key  socre  value 
zrange books 0 -1 #排序
zrevrange books 0 -1 #逆序
zcount key min max 查询出分值间有多少个元素
zcard books
#获取value的socre
zscore books "java"
zrank books "java" # 排名 0开始
# 根据分值区间遍历 zset
zrangebyscore books 0 8.91
# 根据分值区间 (-∞, 8.91] 遍历 zset,同时返回分值
zrangebyscore books -inf 8.91 withscores
#删除value
zrem books "java"
zremrangebyrank key start stop
ZREMRANGEBYSCORE key min max
ZSCAN key cursor [MATCH pattern] [COUNT count]

容器型数据结构的通用规则

create if not exists 如果不存在则创建一个,drop if no elements 没有元素即释放内存

过期时间

redis的过期时间是以对象为单位,例如hash,真个hash都过期了。
给字符串设置过期时间,如果再次发生set操作,那么过期时间失效。

redis 延迟队列

一般情况下使用rpush lpop二个命令即可。但是这2个命令如果队列为空就会产生空轮询导致cup上升redis的qps也会高,那么使用blpop,rlpop 阻塞读取,但是这样要注意捕获异常,因为redis空闲链接会自动断开,编写客户端要注意,还要重试。

位图

比如一个用户的一年签到,签到1,未签到0,redis提供了位图数据结构,签到记录就是1位,365天就是46个字节,—待继续学习

HyperLogLog

pv pageview 访问页面次数
uv 独立访客次数 指同一个客户端访问n次记一次。

HyperLogLog 提供不精确的去重计数方案,10w数据差277个 ,pf 的内存占用为什么是 12k

1
2
3
4
pfadd pageid user1
pfadd pageid user2
pfcount pageid
pfmerge,用于将多个 pf 计数值累加在一起形成一个新的 pf 值。

布隆过滤器bloomfilter

布隆过滤器可以理解为一个不怎么精确的 set 结构
Redis 4.0 提供了插件功能之后才正式登场

1
2
布隆过滤器有二个基本指令,bf.add 添加元素,bf.exists 查询元素是否存在
bf.madd bf.mexists

原理

在redis里就是一个大型的位数组和几个不一样的无偏hash函数。无偏就是hash算的比较均匀
add 时候用多个hash函数对key进行hash计算一个整数索引值,之后对位数组长度取模,得到多个位置设置成1。
查询key是否存在时候,同样,只要有一个位置是0那么就不存在,如果都是1只能说明大概率存在,有可能误判。

本文欢迎转载,但是希望注明出处并给出原文链接。 如果你有任何疑问,欢迎在下方评论区留言,我会尽快答复。 如果你喜欢或者不喜欢这篇文章,欢迎你发邮件到 alonecong@126.com 告诉我你的想法,你的建议对我非常重要。

------ 本文结束感谢您的阅读! ------
0%