Redis共有5种基本数据类型与三种特殊类型
Redis是单线程基于内存操作,cpu不是瓶颈,瓶颈是内存与网络带宽;
Redis-Key
常用命令:
- select 切换数据库
- dbsize 数据库数量查询
- key * 查看所有key
- flushdb 清除当前数据库
- flushall 清除全部数据库内容
- set 设置key
- exists 判断是否存在
- expire 设置key过期时间
- ttl 查看剩余时间
- type 查看key的类型
五大数据类型
String(字符串)
append 追加字符串,如果key不存在相当于set一个新的key
strlen 获取字符串长度
incr 自增1
decr 自减1
incrby 自增一个步长
decrby 自减一个步长
getrange key 0 1 获取字符串[0,1]
getrange key 0 -1 获取全部字符串
setrange key 1 xx 替换指定位置的字符串
setex(set with expire) 设置并附带过期时间
setnx(set if not exist) 如果不存在再设置(分布式锁中常常设置)
mset 同时设置多组kv
mget 同时获取多个值
msetnx 如果不存在再设置,同时成功或者失败
对象 key设计为user:{id}:{filed}
set user:1 {k1:v1, k1:v1} 设置一个 user:1 对象,值为json
mset user:1:k1 v1 user:1:k2 v2 值单独设置
getset 先get再set,如果不存在则返回nil,如果存在,获取原来的值;并设置新的值
使用场景:
- 计数器
- 统计多单位的数量
- 对象缓存存储
List
基本的数据类型,列表,在redis中可以用作队列、栈等
所有的List命令都是“l”开头的
lpush 将一个或者多个数值,插入到列表的头部(左)
rpush 将一个或者多个数值,插入到列表的尾部(右)
lrange list 0 -1 取值
lpop 移出第一个元素
rpop 移出最后一个元素
lindex 根据下标获取值
llen 获取列表长度
lrem list 1(删除数量) v 移除指定的值
ltrim 截取
rpoplpush 移除列表最后一个元素,并添加到一个新列表中
lset 指定下标更新,没有会报错
linsert 在具体值前或后插入值
**使用场景**栈 lpush lpop
队列 lpush rpop
Set(集合)
set中的值不能重复,无序不重复集合
- sadd 添加
- smembers 查看
- sismember 查看某一个值是否存在
- srem 移除某一个值
- scard 查看有多少值
- srandmember 随机抽取一个或多个元素
- spop 随机删除
- smove 将一个指定的值移动到另外一个set集合
- sdiff 差集
- sinter 交集
- sunion 并集
使用场景
- 共同关注
- 二度好友(六度分割理论)
Hash
Map集合,key-map 值为一个map集合,本质和spring没有太大区别
- hset 设置
- hget 取值
- hmset 批量设置
- hmget 批量取
- hgetall 获取全部字段和值
- hdel 删除指定的key字段,对应的值也会被删除
- hlen 获取字段数量
- hexists 判断hash中指定字段是否存在
- hkeys 获取全部key
- hvals 获取所有值
- hincrby 自增
- hdecrby 自减
使用场景:
- 变更的数据 user name ······ 更适用于对象的存储,String更适用于字符的存储
Zest(有序集合)
在set基础上增加了一个值,set:k1 v1; zset:k1 score1 v1
- zadd 添加
- zrange 查询
- zrangebyscore 根据score排序升序
- zrevrangebyscore k +inf -inf 根据score降序
- zrem 删除
- zcard 获取集合中的个数
- zcount 获取指定区间的数量
使用场景:
- set 排序
- 权重判断
- 排行榜
其余api详见官网
三种特殊数据类型
Geospatial(地理位置)
定位、附近的人、打车位置计算,可以推算地理位置信息
- geoadd key (纬度 经度 名) 添加位置,两级添加不了
- geopos 获取指定的位置
- geodist 获取两地的距离
- georadius 通过半径找附近的人,所有的数据都应在一个key里
- georadiusbymember 通过成员名找周边
- geohash 将二维的经纬度转换为一堆字符串,越接近距离越近
底层实现原理就是zset,可以使用zset来操作
- zrem 删除
- zrange 查看
Hyperloglog(基数统计)
优点:占用的内存是固定的,计算2^64不同的元素的基数只要12kb
- pfadd 添加
- pfcount 计算元素个数
- pfmerge 合并两个key,并集
使用场景:
- 计算网页的uv(一个人访问一个网站多次,但是还是算一个人),有0.81%的错误率
如果允许容错可以使用hyperloglog,如果不能容错则使用set或者自己的数据类型
Bitmaps(位存储)
- setbit 设置值
- getbit 查看
- bitcount 统计1的数量
使用场景:
- 统计疫情感染人数 0 1 0 0
- 统计活跃不活跃
- 登录未登录
- 打卡
两个状态的都可以使用Bitmaps,只有0 1两个状态