Redis数据类型及常用API

 阅读约 12 分钟

1、redis特性
速度快:redis是内存型
持久化:redis可以持久化
数据结构:redis支持多种数据结构,string hash list set zset
多语言客户端:redis支持多种客户端语言
功能丰富:发布订阅、事务、pipeline、bitmap、geo
简单:上手简单,开源
复制:自带RDB和AOF主从复制
高可用分布式:自带的分布式

redis是单线程:纯内存,非阻塞IO,避免线程切换和静态消耗
redis使用场景:缓存系统,计数器,消息队列,排行榜,社交网络,实时系统

2、redis的启动方式

  • 默认启动 redis-server
  • 参数启动 redis-server -h 127.0.0.1 -p 6379
  • 配置启动(推荐)

3、redis通用命令
通用命令:

  • keys * 遍历所有的key (o(n))该命令一般不在生产环境使用 scan 或者热备节点可以遍历
  • dbsize 计算key的总数 (o(1))
  • exists key 检查key是否存在 存在返回1 不存在返回 0
  • del key 删除指定的key
  • expire key seconds 设置key在seconds秒后过期
  • ttl key 查看key剩余的过期时间 -2 代表已经不存在 -1 代表key存在,并且没有过期时间
  • persist key 去掉key的过期时间
  • type key 返回key的类型 返回值包括:string hash list set zset none(不存在)
    • *

string字符串:
使用场景:缓存 计数器 分布式锁

  • get 获取key对应的value
  • set 设置key-value 不管key是否存在,都设置
  • del 删除key-value
  • incr key自增1,如果key不存在,自增后get(key)=1
  • decr key自减1,如果key不存在,自减后get(key)=-1
  • incrby key自增k,如果不存在,自增后get(key)=k
  • decrby key自减k,如果不存在,自减后get(key)=-k
  • 实际使用:记录网站每个用户个人主页的访问量
  • incr userid:pageview(单线程,无竞争)
  • setnx key不存在,才设置
  • set key value xx key存在才设置
  • mget 批量获取key原子操作 一次获取的key值有限
  • mset 批量设置key
n次get = n次网络时间+n次命令时间
1次mget = 1次网络时间+n次命令时间
  • getset key newvalue set key newvalue并返回旧的value
  • append key value 将value追加到旧的value
  • strlen key 返回字符串得长度
  • incrbyfloat key 增加key对应的值
  • getrange key start end 获取字符串指定下标的所有值
  • setrange key index value 设置指定下标所有对应的值

hash类型
使用场景:存储个人信息,记录网站每个用户的个人主页访问量

  • hget key field 获取hash对应的field的value
  • hset key field value 设置hash key 对应的field的value
  • hdel key field 删除hash key 对应field的value
  • hexists key field 判断key是否有field
  • hlen key 获取hash key field的数量
  • hmget key field1 field2 批量获取hash key的一批field对应的值
  • hmset key field1 value1 field2 value2 批量设置hash key的一批field value
  • hgetall key 获取hash对应的key的所有field的value
  • hvals key 返回hash key对应所有field的value
  • hkeys key 返回hash key对应所有field
  • hsetnx key field value设置hash key对应field的value(如field已存在,则失败)
  • hincrby key field intCounter hash key对应field的value自增intCounter
  • hincrbyfloat key field floatCounter hincrby的浮点数版

list队列类型
使用场景 timeLine

  • rpush key value1 value2 从列表右端插入值
  • lpush key value1 value2 从列表左端插入值
  • linsert key before|after value newValue 在list指定的值前|后插入newValue
  • lpop key 从列表左侧弹出一个item
  • rpop key 从列表右侧弹出一个item
  • lrem key count value 根据count的值,从列表中删除所有value相等的项
count > 0 从左到右,删除最多count个value相等的项
count < 0 从右到左,删除最多Math.abs(count)个value相等的项
count = 0 删除所有value相等的项
  • ltrim key start end 按照索引范围修剪列表
  • lrange key start end (包含end) 获取列表指定索引范围的索引item
  • lindex key index 获取列表指定索引的item
  • llen key 获取列表的长度
  • lset key index newValue 设置列表指定索引值为newValue
  • blpop key timeout lpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞
  • brpop key timeout rpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞
    • *

set集合类型
使用场景:抽奖系统,like 赞 踩,标签

  • sadd key element 向集合key添加element(如果element已经存在,添加失败)
  • srem key element 将集合key中的element移除掉
  • scard key 计算集合大小
  • sismember key element 判断element是否在集合内
  • srandmember key 从集合中随机抽取count个元素 (不改变原集合)
  • smembers key 获取集合所有元素
  • spop key 从集合中弹出element (改变原集合)
  • sdiff key 差集
  • sinter key 交集
  • sunion key 并集
    • *

zset有序集合
使用场景:排行榜

  • zadd key score element(可以是多对)添加score和element
  • zrem key element(可以是多对) 删除元素
  • zscore key element 返回元素的分数
  • zrank key element 返回元素的排名
  • zincrby key increScore element 增加或减少元素的分数
  • zcard key 返回元素的总个数
  • zrange key start end 返回指定索引范围内的升序元素
  • zrangebyscore key minScore maxScore 返回指定分数范围内的升序元素
  • zcount key minScore maxScore 返回有序集合内在指定分数范围内的个数
  • zremrangebyrank key start end 删除指定排名内的升序元素
  • zremrangebyscore key minScore maxScore 删除指定分数内的升序元素
  • zrevrank 返回元素的排名 降序
  • zrevrange 返回指定分数范围内的降序元素
  • zrevrangebyscore 返回有序集中指定分数区间内的所有成员
  • zinterscore 计算一个或多个有序集的交集
  • zunionscore 计算一个或多个有序集的并集

4、redis的特性
慢查询
生命周期:①发送命令②排队③执行命令④返回结果
慢查询发生在第3阶段,客户端超时不一定慢查询,但慢查询是客户端超时的一个可能
slowlog-max-len 先进先出队列 固定长度 保存在内存中
slowlog-log-slower-than 慢查询阈值 slowlog-log-slower-than=0 记录所有命令 slowlog-log-slower-than < 0 不记录所有命令
修改配置文件
config get slowlog-max-len=128
config get slowlog-log-slower-than=10000
修改配置文件重启
动态配置
config set slowlog-max-len 1000
config set slowlog-log-slower-than 1000
慢查询命令:

slowlog get[n]:获取慢查询队列长度
slowlog len:获取慢查询队列长度
slowlog reset:清空慢查询队列

注意:
slowlog-max-len 不要设置过大,默认10ms,通常设置1ms
slowlog-log-slower-than不要设置过小,通常设置1000左右
理解命令生命周期
定期持久化慢查询

pipeline
网络命令通信模型:
传输命令=》返回结果
一次时间 = 一次网络时间 + 一次命令时间
批量网络命令通信模型:
n次时间 = n次网络时间 + n次命令时间
流水线:
1次pipeline(n条命令) = 1次网络时间 + n次命令时间
注意:
*redis的命名时微秒级别
pipeline每次条数要控制住*
使用建议

注意每次pipeline携带的数据量
pipeline每次只能作用在一个Redis节点上
M操作与pipeline的区别

发布订阅

发布者:publisher channel message 返回订阅者的个数
订阅者:subscriber channel 一个或多个
取消订阅:unscribe channel 一个或多个
订阅模式:psubscribe [pattern] punsubscribe channel
频道:channel

bitmap位图

使用场景:独立用户统计
setbit key offset value 给位图指定索引设置值
getbit key offset 获取位图指定索引的值
bitcount key [start end] 获取位图指定范围(从start到end,单位为字节,如果不指定就是获取全部)位值为1的个数
bitop op destkey key [key ...] 做多个Bitmap的and(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存在destkey中
bitos key targetBit [start] [end] 计算位图指定范围(start到end,单位为字节,如果不指定就是获取全部)第一个偏移量对应的值等于targetBit的位置

注意
1、type=string,最大512MB
2、注意setbit时的位移量,可能有较大的耗时
3、bitmap不是绝对的好

HyperLogLog

基于HtperLogLog算法:极小的空间完成独立数据量统计,本质还是字符串
pfadd key element 向hyperloglog添加元素
pfcount key 计算hyperloglog的独立总数
pfmerge destkey sourcekey 合并多个hyperloglog数据

注意
1、是否能容忍错误(错误率0.81%)
2、是否需要单条数据

GEO地理信息

存储经纬度,计算两地距离,范围计算等
geoadd key longtitude latitude member增加地理位置信息
geopos key member [member] 获取地理位置信息
geodist key member1 member2 获取两个地理位置的距离

注意
1、since 3.2+
2、type geokey = zset
3、没有删除API:zrem key member
阅读 171更新于 10月16日
推荐阅读
目录