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

示例:排行榜场景

posted @ 2018-10-10 09:37  NiRao  阅读(295)  评论(0编辑  收藏  举报