2023-03-19

Redis数据类型与命令

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两个状态