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  阅读(327)  评论(0)    收藏  举报