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

数据指针

虚拟内存

其他信息

redisson 操作api redis常用api_字符串

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调用
如图:

redisson 操作api redis常用api_redis_02

相应的命令的学习:

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 # 设置指定下标所有对应的值

redisson 操作api redis常用api_redis_03

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 浮点数版

redisson 操作api redis常用api_redisson 操作api_04

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

redisson 操作api redis常用api_hg_05

集合 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

redisson 操作api redis常用api_字符串_06