Redis
2020-10-26 18:22:44 0 举报
AI智能生成
Redis笔记
作者其他创作
大纲/内容
五大数据类型
String
常用API
set key value
添加一个值
get key
获取当前key的值
mset key1 value1...keyn valuen
批量添加
mget key1...keyn
批量获取
expire key time
设置过期时间,单位是秒
setex key time value
添加数据的时候直接设置过期时间
setnx key value
当key不存在时才设置
incr key
当值为int时自增
incrby key int
数学运算 int 可以为负数
位图
API
setbit key index value
设置key的第index位位value value只能取0或1
bitcount key
统计key中有多少个1
bitcount key start end
统计范围中1的个数,start end表示字符的下标
bitpos key value
查找value第一次出现的位置
数据结构
使用的类似于ArrayList的数据结构,预分配容易空间,1M以前是二倍扩容,大于1M是每次扩容1M最大512M
list
常用API
rpush key value1 value2...valuen
向右添加一个值
llen key
求长度
lpop key
左弹出一个值
rpop key
右弹出一个值
lindex key index
查找第index个值,效率低慎用
lrange key 0 -1
返回第一个到倒数第一个的集合
ltrim key start end
截取集合第start个到第end个值,其余删除
blpop key
弹出最左边元素,如果没有元素就阻塞
数据结构使用类似于LinkedList的数据结构,添加效率高查询效率低
可以作为消息队列使用,但是效率较差
hash
常用API
hset key eleKey value
添加一个key的hash并添加key为eleKey值为value的元素
hgetall key
获取所有属性的key和value
hlen key
获取属性的个数
hget key elekey
获取单个元素key的值
hincrby key elekey int
值+int,int可以为负数
数据结构
使用类似于HashMap的数据结构,同样会rehash,但是在rehash是渐进式的,会逐步的移动数据到新的hash中,在完全完成之前,旧的hash依旧会提供服务
set
常用API
sadd key value
添加一个值
smembers key
遍历key中所有值
sismember key target
查看tartget是否存在
scard key
求长度
spop key
弹出一个值
zset
常用API
zadd key score value
添加一个值为value分数为score的值
zrange key 0 -1
返回第一个到倒数第一个的集合
zrevrange key 0 -1
逆序返回第一个倒倒数第一个的集合
zcard key
求集合长度
zscore key value
获取指定长度的分数
zrank key value
返回value的分数
zrangebyscore key score1 score2
返回分数区间的集合,分数可以为-inf表示负无穷
zrem key value
删除指定的value值
数据结构
当数据量小时使用比较紧凑的ziplist,因为如果数据量很小还要存很多指针,内存开销比较大,当数据量大时使用quickList数据结构
分布式锁
核心思想
使用setnx key value命令去争抢添加一个值,谁添加了值锁归谁所有
问题及解决方案
死锁问题
当一个线程抢到了锁,但是还没有删除数据时,客户端宕机,导致无法解锁
解决方案,设置数据的过期时间,如果锁的持有者宕机也会自动删除,不影响后续逻辑
过期时间长短问题
如果业务逻辑未执行完成,数据过期了
解决方案:需要另起一个线程去不断监视着锁的持有者如果锁的持有者还没有执行完逻辑,那就延长时间
可重入问题
如果一个锁的持有者内部依然需要获取锁,那么如果不加以处理依然无法获取
解决方案:在强锁时设置value为当前客户端id,当重入锁时先查看是否被本客户端所有
未抢到锁处理
当前客户端未抢到锁该如何处理
当客户端未抢到锁时,获取锁的超时时间,然后sleep一段时间,不断轮询加锁
redis服务器宕机
当redis主服务器宕机后,备机被选为主节点,此时如果其他客户端加锁成功,之前的锁的持有者也会认为自己成功加锁
问题解决:redlock
核心思想:客户端对多台redis进行设置值如果某台客户端抢到锁最多,表明他持有锁
HyperLogLog
作用
用来估算基数
API
pfadd key value
添加一个值
pfcount key
统计基数
布隆过滤器
作用:可以理解为一个set集合,可以判断一个值有没有存在
布隆过滤器作为一个插件加载到 Redis Server 中,给 Redis 提供了强大的布隆去重功能。
API
bf.add key value
在key中加入一个值
bf.exists key value
查看某个值在key中是否存在
bf.madd key value1 value2...valuen
批量插入
bf.mexists key value1...valueN
批量查询
注意事项
当设置的initial_size过大可能会造成内存冗余,过小准确率变小
当设置的error_rate越小,需要的空间越大
简单限流
解决方案:我们可以使用zset来解决这个问题,使用时间来作为score,可以查看任意时间窗的数据,当数据过大时进行限流
不适合做量大的限流因为太浪费空间
漏斗限流
使用Redis-Cell模块
API
cl.throttle key 最大容量 漏水速率(次数/时间单位为秒)
返回值
第一参数表示是否接受,第二个表示漏斗容量,第三个表示漏斗剩余空间,第四个表示拒绝了大概需要多长时间重试,第五个表示大概需要多长时间漏洞空出来
GEO
作用:存储地理位置
使用数据库来存储计算距离,效率瓶颈
GeoHash 算法
API使用
geoadd key 经度 纬度 value
添加一个地理位置
geodist key 地点1 地点二 单位
返回两个地方的距离
geopos key value
获取地点的经纬度
geohash key value
获取地点的hash值,可以使用这个编码值去 http://geohash.org/${hash}中进行直接定位
georadiusbymember key 地点 距离 单位 count 数量值 asc/desc
返回地点指定距离内的地点,返回数量可以指定,倒叙逆序也可以指定
withcoord withdist 可选参数 返回经纬度,返回距离
georadius company 经度 纬度 距离范围 km withdist count 数量 asc/desc
返回指定经纬度周围的地点
注意事项
单个key不宜过大,建议 Geo 的数据使用单独的 Redis 实例部署
Scan
作用:用来列出所有满足特定正则字符串规则的 key。
原始写法
keys *
返回所有能匹配正则表达式的key
问题
没有 offset、limit 参数,一次性吐出所有满足条件的 key,万一实例中有几百 w 个
key 满足条件,将非常可怕
key 满足条件,将非常可怕
特点
复杂度为O(n),但是不会阻塞线程
提供 limit 参数,可以控制每次返回结果的最大条数
返回的结果可能会有重复,需要客户端去重复
遍历的过程中如果有数据修改,改动后的数据能不能遍历到是不确定的
单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零
0 条评论
下一页