Redis 数据结构和API介绍
Redis API的使用和理解
通用命令
# 便利出所有的key,后面参数类似正则通配符的概念,一般不在生产环境中使用
keys *
keys he*
key he[h-l]*
key ph?
# 计算key的总数
dbsize
# 判断key是否存在,存在返回1 ,不存在返回0
exists key
# 删除 key,删除成功1 ,失败 0
del kee [key...]
# 设置key的过期时间 秒
expire key seconds
# 查看数据类型
type key
# 查看key剩余的过期时间 ;-2 代表不存在了,-1 代表key存在,并且并没有过期时间
ttl key
# 去掉 key的过期时间
persist key
数据结构和内部编码
图示:
单线程为什么快?
- 纯内存
- 非阻塞IO
- 避免了线程切换和竟态消耗
注意
- 一次只运行一条命令
- 拒绝长(慢)命令 : keys,flushall,flushdb,slow lua script,mutil/exec,operate big value(collection)
- 其实不是单线程,在 fysnc file descriptor,close file descriptor
数据机构
Redis所有的key 都是字符串,value 分为不同的数据类型
字符串类型 :场景 缓存 计数器 分布式锁
记录网站访问量,缓存视频基本信息,分布式id生成器
# 使用示例
先从redis获取数据,如果为空,则从mysql从获取数据,在存入到 redis中
# 常用命令
get
set
del
# key自增一,如果key不存在,自增后get(key)=1
incr key
# key自减 1,不存在 get(key)=-1
decr key
# key 自增 k ,key不存在,自增后 get(k)=k
incrby key k
# key自减 k,key不存在 ,自减后 get(key)=-k
decrby key k
# 不管key是否存在,都设置
set key value
# key 不存在,才设置
setnx key value
# key存在,才设置
set key value xx
# 批量获取key,原子操作
mget key1 key2 key3 ..
# 批量设置
mset key1 value1 key2 value2 ....
# set key nwevalue 并返回旧的 value
getset key newvalue
# 将value追加到旧的value
append key value
# 返回字符串的长度(注意中文)
strlen key
# 增加key 对应的值3.5
incrbyfloat key 3.5
# 获取字符串指定下标所有的值
getrange key start end
# 设置指定下标所有对应的值
setrange key index value
哈希键值结构 : key field value, field不能相同,value可以相同
# 获取hash key对应的field的value
hget key field
hget user:1:info age
# 设置hash key对应的field的value
hset key field value
hset user:1:info name ronaldo
# 删除hash key 对应的field的value
hdel key field
# 判断 hash key是否有 field
hexists key field
# 获取 hash key field的数量
hlen key
# 批量获取 hash key的一批field对应的值
hmget key field1 field2 ... fieldN
# 批量设置 hash key的一批 field value
hmset key field1 value1 field2 value2 ...
# 返回 hask key 对应所有的 field 和value
hgetall key
# 返回hash key对应所有field的value
hvals key
# 返回 hash key对应所有的field
hkeys key
# 设置 hash key对应的field的value(field存在,则失败)
hsetnx key field value
# hash key 对应的field的value自增 int counter
hincrby key field intcounter
# hincrby浮点数版
bincrbyfloat key field floatCounter
场景:记录每个用户个人主页的访问量
hincrby user:1:info pageView count
字符串和哈希相比
- string : 编程简单但是需要序列化,设置属性要操作整个数据
- hash : 直观,节省空间,可以部分更新但是编程稍微复杂,ttl不好控制
列表类型: key-value ,value为有序的队列,并且可以重复的
# 从列表右端插入值
rpush key value1 value2 .....
# 从列表左端插入值
lpush key value1 value2 ....
# 在list指定的值前|后插入 newvalue
linsert key before|after value newValue
# 从列表左侧弹出一个item
lpop key
# 从列表右侧弹出一个item
rpop key
# 根据count值,从列表中删除所有的value相等的项;count>0,从左到右,删除最多的count个value相等的项;count=0,删除所有value相等的项;count<0,从右到左,删除最多Math.abs(count)个value相等的项
lrem key count value
# 按照索引范围修剪列表
ltrim key start end
# 获取列表指定索引范围的所有item
lrange key start end(包含end)
# 获取列表指定索引的item
lindex key index
# 获取列表的长度
llen key
# 设置列表指定索引值为newvalue
lset key index newvalue
# lpop 阻塞版本,timeout时阻塞超时时间,timeout=0为永远阻塞
blpop key timeout
# rpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞
brpop key timeout
示例:微博-TimeLine
集合类型 :无序,没有重合的元素,支持集合间的操作
# 向集合 key 添加 element (如果 element已经存在,添加失败)
sadd key element
# 将集合key中的element移除掉
srem key element
# 计算集合的大小
scard user:1:follow
# 判断it是否在集合中 返回1 存在
sismember user:1:follow it
# 从集合中随机挑选count元素
srandmember user:1:follow count
# 返回集合中所有的元素,是无序的
smembers user:1:follow
# 从集合中弹出元素
spop
# 集合间的操作
# 差集 不同的东西
sdiff
# 交集
sinter
# 并集
sunion
示例:抽奖系统,赞,踩等;添加标签,共同关注等
有序集合类型 : 有序,无重复元素
# 添加 score和element ,score可以重复,但是 element不可以重复
zadd key score element
zadd user:1:ranking 225 tom
# 删除元素
zrem key element(可以是多个)
#返回元素的分数
zscore key element
# 增加或减少元素的分数
zincrby key increScore element
# 返回元素的总个数
zcard key
# 返回指定索引范围内的升序元素[分值]
zrange key start end [WITHSCORES]
# 返回指定分手范围内的升序元素[分值]
zrangebyscore key minscore maxscore [withscores]
# 返回有序集合内在指定分数范围内的个数
zcount key minScore maxScore
# 删除指定排名内的升序元素,角标
zremrangebyrank key start end
# 删除指定分数内的升序元素
zremrangebyscore key minScore maxScore
zrevrank
zrevrange
zrevrangebysocre
# 集合间的操作
zinterstore
zunionstore
示例:排行榜场景