redis API 的使用和理解:
1.通用命令
2.字符串类型
3.哈希类型
4.列表类型
5.集合类型
6.有序集合类型
1.通用命令
1.1 通用命令
keys (keys * :得到所有key对用的结果集)
keys 命令一般不在生产环境中使用
keys怎么用? 从备用节点
scan
dbsize 计算key的总数
exits keys 判断key是否存在 存在返回1,不存在返回0
del key[key…] 可以删除单个或多个key
成功删除返回1,如果删除的key-value不存才则返回0
expire key seconds 设置key的过期时间,过了时间会自动删除,
expire key seconds # key 在seconds 秒后过期
(-2 代表key 已经不存在了)
ttl key # 查询key的剩余的过期时间
persist key # 去掉key的过期时间 永远不会过期
type key # 返回key的类型
共有六种: string hash list set zset none
1.2 数据结构和内部编码
redisObject :
数据类型:string hash list set sorted set
编码方式(encoding): raw int ziplist linkedlist hashmap intset
数据指针
虚拟内存
其他信息
1.3 单线程架构
阻塞,redis在一瞬间只能执行一条命令
为什么单线程: 纯内存
非阻塞IO
避免线程切换和竞态消耗
注意:
一次只能运行一条命令
拒绝长(慢)命令
其实不是单线程
2.字符串类型
2.1字符和命令
2.2快速实战
2.3 内部编码
2.4 查漏补缺
字符串上限 512M
场景:缓存,计数器, 分布式锁,等等
get key #获得key对应的value
set key value # 设置key-value
del key # 删除key-value
incr key # key自增1 如果key不存在,自增后get(key) =1
decr key # key自减1,如果key不存在,自减后get(key) = -1
incrby key k # key自增k 如果key不存在,自增后get(key) =k
decr key k #key自减k,如果key不存在,自减后get(key) = -k
查询用户的登录网页的次数:
incr userid:pageview(单线程:无竞争,可以作为计数器)
实战:
实现如下功能:
缓存视频的基本信息(数据源在mysql中)伪代码
首先查看redis中是否有查找的数据有的话直接返回APP,没有再从
mysql中查找,保存到redis中,再从redis调用
如图:
相应的命令的学习:
set setnx setxx
set key value # 不管key是否设置过都设置,
setnx key value # key不存在,才设置
set key value xx # key存在,才设置
mget mset 针对批量操作
mget keya keyb keyc # 批量获取key, 原子操作
mset ka va kb vb kc vc # 批量的设置k-v
n次 get = n次网络时间 + n 次命令时间
1次 mget = 1次网络时间 + n 次命令时间
mget 节约大量的网络时间
mget 处理大量时间的时候最好拆分,
getset append strlen
getset key new value # set key newvalue 并返回旧的value
append key value # 将value追加到旧的 value
strlen key # 返回字符串的长度(注意中文)
incrbyfloat getrange setrange
incrbyfloat key 3.5 # 增加key 对应的值 3.5
getrange key start end # 获取字符串指定下标所有的值
setrange key index value # 设置指定下标所有对应的值
3.哈希类型
key field value
name aaa
user:info age 40
Date 2019
hash中可以添加一个新的属性(field value)
add a new value 将数据序列化
特点:Mapmap small redis field 不能相同,value可以相同
重要的API
hget hset hdel
hget key field # 获取hash key对应的field的value值
hgetall
hset key field value #设置hash key 对应的field的值
hdel key field # 删除hash key 对应的field的value值
hmget hmset
hmget key field1,field2,…fieldN #批量获取hash key 的一批field对应值
hmset key field1 value1,…fieldN valueN
批量设置hash key 的一批field value
实战:
实现功能:缓存视频的基本信息(数据源在mysql中)伪代码
hgetall hvals hkeys
hgetall key #返回hash key对应的所有的field和value
hval key # 返回hash key对应的field的value值
hkeys key # 返回hash key对应的所有的field
小心使用hgetall :牢记单线程
stirng vs hash 相似的API
get hget
set setnx hset hsetnx
incr incrby
decr decrby hincrby
del hdel
mset hmset
mget hmget
用户信息(string实现)
key value(serializable:json,xml,protobuf)
user:1 {“id”:1
“name”: “aaa”
“age” : 40
“pageView” :50000
}set user:1 serialize(userinfo)
string 形式 用户的信息不是一个整体
用户信息(hash)
key field value
name aaa
user:1:info age 40
pageView 500000
用户的信息是一个整体
hsetnx hincrby hincrbyfloat
hset key field value # 设置hash key对应field的value(如field已存在,则失败)
hincrby key field intCounter # hash key 对应的field的value自增intCounterhincrbyfloat key field floatCounter # hincrby 浮点数版
4.列表类型 list
list 有序,可重复,左右两边插入弹出
rpush key valuea valueb … valueN # 从列表右端插入值(1-N)O(1~n)
lpush key valuea valueb … valueN # 从列表左端插入值(1-N)O(1~n)linsert key before|after value newValue #在list指定的值前|后插入newValue O(n)
lpop key # 从列表左侧弹出一个item
rpop key # 从列表右侧弹出一个itemlrem key count value #根据count值,从列表中删除所有value相等的项
1. count> 0,从左到右,删除最多count个value相等的项
2)count<0 ,从右到左,删除最多Math.abs(count)个value相等的项2. count =0 删除所有value相等的项
ltrim key start end (不包含end)# 按照索引范围修剪列表
lrange key start end(包含end)#按照列表指定索引范围所有item
lindex key index # 获取列表指定索引的item
llen key # 获取列表长度
lset key index newValue # 设置列表指定索引值为newValue
blpop brpop
blpop key timeout #lpop阻塞版,timeout是阻塞超时时间,
timeout=0 为永远不阻塞brpop key timeout # rpop阻塞版本,timeout 是阻塞超时时间timeout=0 为永远不阻塞
TIPS
1. LRUSH +LPOP =stack
2. lpush +rpop = queue
3. lpush +ltrim = capped collection
4. lpush +brpop = message queue
5.集合类型 无序集合
集合结构: key values
特点:无序,无重复,集合间操作
sadd srem
sadd key element #向集合key 添加element(如果element已经存在,添加失败
srem key element #将集合key中的element移除掉scard sismember srandmember smembers
scard user:1:follow =4 #计算集合大小
sismember user:1:follow it =1(存在)# 判断it是否在集合中
srandmember user:1:follow count = his # 从集合中随机挑count个元素
spop user:1:follow=sport #从集合中随机弹出一个元素
smembers user:1:follow = music his sport it #获取集合所有元素smembers 无序,小心使用
spop 从集合中弹出
srandmember 不会破坏集合
集合间的演示,交并差集
sdiff sinter sunion
差集 交集 并集
sadd = tagging
spop/srandmember = random item
sadd +sinter = social graph
6.有序集合类型
特点:组成: key score value
集合 vs 有序集合
无重复元素 无重复元素
无序 有序
element element+ score
列表 vs 有序集合
可以有重复元素 无重复元素
有序 有序
element element+score
重要API: Z开头
zadd :
zadd key score element(可以是多对) # 添加score和 element [O(logN)]zrem :
zrem key element(可以是多个) # 删除元素 o(1)zscore:
zscore key element # 返回元素的分数zincrby:
zincrby key increScore element # 增加或者减少元素的分数 o(1)zcard :
zcard key # 返回元素的总个数;zrange:
zrange key start end [withscores]
#返回指定索引范围内的升序元素【分值】o(log(n)+m)zrangebyscore
zrangebyscore key minScore maxScore [withscores]
#返回指定分数范围内的升序元素【分值] o(log(n)+m)zcount:
zcount key minScore maxScore #返回有序集合内在指定分数范围内的个数 o(log(n)+m)zremrangebyrank:
zremrangebyrank key start end #删除指定排名内的升序元素zremrangebyscore:
zremrangebyscore key minScore maxScore #删除指定分数内的升序元素 o(log(n)+m)zrevrank
zrevrange
zrevrangebyscore
zinterstore
zunionstore