Redis API的使用和理解

1.通用命令

1 keys * 计算所有健【o(n)】

key he*
key he[h-l]* //第三位是h-l 之间
key ph? //只代表三位

2.dbsize 数据库大小(键值对个数)【o(1) 故可以随意使用】

3.判断键的存在性 EXISTS key 存在返回1 否则 0【一般可以随意使用】

4.删除键 DEL key[key…] 【o(1) 故可以随意使用】

5 expire key seconds 【o(1) 故可以随意使用】

ttl key 查询key 剩余的过期时间
【-1 key存在,但是没有设置过期时间/ -2 key已经不存在了】

persist key 去掉key的过期时间

6.type key 【o(1) 故可以随意使用】

数据结构和内部编码

数据类型(type)
编码方式
数据指针
虚拟内存
其他信息

单线程

所有操作串行化 ,一次只运行一条命令。
1.纯内存
2.非阻塞IO
3.避免线程切换

字符串类型

1.1结构和常用指令

key –string
value–int “counts”:4
value–string “id” : “2319”
value –bit “bits”:11011101

1.set key value o(1) # 成功返回 OK
2.get key o(1)
3.del key o(1)

//用于计数
4.incr key #key不存在 ,则自增后get(key) =1
5.decr key # O(1)
6. incr key k #key 不存在,则自增后get(key) = k
7. decr key k #O(1)

8.setnx key value #key 不存在才设置 类似add 操作 成功返回1 失败返回 0
9.set key value xx / setxx key value #key存在,才设置 类似更新操作 成功返回 ok ;失败返回 nil

10.mset key value [key2 value1 key2 value2…] #批量设置 key,value
11.mget key [ key1 key2…] #批量获取 key,原子操作 o(n)

12.getset key value # 设置新值,返回旧值
13.append key value #将value 追加到旧 value
13.strlen key #返回字符串的长度 O(1) 操作

14incrbyfloat key value #浮点数的自增
10.setrange key offset value #设置字符串指定下标的所有的值
11.getrange key start end #获取字符串指定下标的所有的值

1.2经典使用场景

1.缓存功能
其中Redis作为缓存层, MySQL作为存储层, 绝大部分请求的数据都是从Redis中获取。 由于Redis具有支撑高并发的特性, 所以缓存通常能起到加速读写和降低后端压力的作用。

 首先从Redis获取用户信息:
 // 定义键
userRedisKey = "user:info:" + id;
// 从Redis获取值
value = redis.get(userRedisKey);
if (value != null) {
// 将值进行反序列化为UserInfo并返回结果
userInfo = deserialize(value);
return userInfo;
}
redis数据库中没有对应信息
// 从MySQL获取用户信息
userInfo = mysql.get(id);
// 将userInfo序列化, 并存入Redis
redis.setex(userRedisKey, 3600, serialize(userInfo));
// 返回结果
return userInfo

2.限速:限制用户每分钟获取验证码的频率, 例如一分钟不能超过5次

phoneNum = "138xxxxxxxx";
key = "shortMsg:limit:" + phoneNum;
// SET key value EX 60 NX
isExists = redis.set(key,1,"EX 60","NX");
if(isExists != null || redis.incr(key) <=5){
// 通过
}else{
// 限速
}
1.3内部编码

字符串类型的内部编码有3种:
int: 8个字节的长整形 set key 8653
embstr: 小于等于39个字节的字符 set key “hello,world”
raw: 大于39个字节的字符 set key “one string greater than 39 byte………”

2哈希

在Redis中, 哈希类型是指键值本身又是一个键值对 field-value 属性和值,可以看成是一张表的一行,每一个属性可以当成表的一个字段。
Redis键值对和哈希类型二者的关系如图
这里写图片描述

2.1哈希常用函数

1.hset key field value #设置hash key 对应的field 的value
2.hget key field #获取hash key 对应的field 的value
3.hdel key field[field …] #删除hash key 对应的field和value

4.hexist key field # 判断hash key field 是否有filed
5.hlen key # 获取hash key field 的数量

6.hmget key field1 field2… #批量获取hash key 的一批field 对应的值
7.hmset key filed value field2 value2… #批量设置一批field value

8.hincr key field value…
9.hgetall key #获取所有属性和值
10.hvals key #返回所有hash key 对应的field 的value
11.hkeys key #返回所有hash key 对应的所有field

2.2内部编码

ziplist(压缩列表) : 当哈希类型元素个数小于hash-max-ziplist-entries
配置(默认512个) 、 同时所有值都小于hash-max-ziplist-value配置(默认64字节) 时, Redis会使用ziplist作为哈希的内部实现, ziplist使用更加紧凑的重点内容结构实现多个元素的连续存储, 所以在节省内存方面比hashtable更加优秀。
hashtable(哈希表) : 当哈希类型无法满足ziplist的条件时, Redis会使用hashtable作为哈希的内部实现, 因为此时ziplist的读写效率会下降, 而
hashtable的读写时间复杂度为O(1) 。

127.0.0.1:6379> hset hashkey f3 "one string is bigger than 64 byte...忽略..."
OK
127.0.0.1:6379> object encoding hashkey
"hashtable"

3.列表

列表(list) 类型同样是一个键值对形式,value是用来存储多个有序的字符串, 可以对列表两端插入(push) 和弹出(pop) , 计算列表的长度,还可以获取/删除指定范围的元素列表、 获取/删除指定索引下标的元素等。

3.1常用命令


1.rpush key value[value…] #从列表右端插入值
2.lpush key value[value…] #从列表左端插入值

3.linsert key before|after value newvalue #在list 指定的值前|后插入 newvalue O(n)


4.lpop key #从列表左端弹出
5.rpop key #从列表右端弹出
6.lrem key count value #根据count 值,从列表中删除所有value 相等的项 O(n) 如果count=0,删除所有的value count>0 从左边删, count<0 从右边删出对应个数value
7.ltrim key start end #按照索引范围修建列表 O(n)


8.lrange key start end #获取列表指定范围所有item
9.lindex key index #获取列表指定位置的元素
10.llen key #获取列表的长度 O(1)


11.lset key index value #修改列表固定位子元素
12.blpop key timeout #阻塞弹出

3.2内部编码

ziplist(压缩列表) : 当列表的元素个数小于list-max-ziplist-entries配置(默认512个) , 同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节) , Redis会选用ziplist来作为列表的内部实现来减少内存的使用。

linkedlist(链表) : 当列表类型无法满足ziplist的条件时, Redis会使用linkedlist作为列表的内部实现

3.3应用场景

1.消息队列
Redis的lpush+brpop命令组合即可实现阻塞队列, 生产者客户端使用lrpush从列表左侧插入元素, 多个消费者客户端使用brpop命令阻塞式的“抢”列表尾部的元素, 多个客户端保证了消费的负载均衡和高可用性
2.文章列表
每个用户有属于自己的文章列表, 现需要分页展示文章列表。 此时可以
考虑使用列表, 因为列表不但是有序的, 同时支持按照索引范围获取元素。

hmset acticle:1 title xx timestamp 1476536196 content xxxx
hmset acticle:k title yy timestamp 1476512536 content yyyy
...
lpush user:1:acticles article:1 article:3
lpush user:k:acticles article:5
...
//分页获取用户文章列表, 例如下面伪代码获取用户id=1的前10篇文
章:
articles = lrange user:1:articles 0 9
for article in {articles}
hgetall {article}

4集合

集合(set) 类型也是用来保存多个的字符串元素, 但和列表类型不一样的是, 集合中不允许有重复元素, 并且集合中的元素是无序的, 不能通过索引下标获取元素,可以进行集合间操作

41常用命令

1.sadd key element[element…] #向集合key 添加element (如果存在添加失败
2.srem key element[element…] #将集合中key 中的element 移除掉

3.sismember key element #判断element 是否在集合中
4..srandmember key[count] #从集合中随机挑选
5.spop key #从集合中随机弹出
6.smembers key #获取所有元素

9.sinter key [key..] //交集
9.suinon key[key…] //并集
10.sdiff key[key…] //差集

4.2内部编码

intset(整数集合) : 当集合中的元素都是整数且元素个数小于set-maxintset-entries配置(默认512个) 时, Redis会选用intset来作为集合的内部实现, 从而减少内存的使用。
hashtable(哈希表) : 当集合类型无法满足intset的条件时, Redis会使用hashtable作为集合的内部实现

4.3 使用场景

集合类型比较典型的使用场景是标签(tag),抽奖共同好友

5.有序集合

它保留了集合不能有重复成员的特性,但不同的是, 有序集合中的元素可以排序。 但是它和列表使用索引下标作为排序依据不同的是, 它给每个元素设置一个分数(score) 作为排序的依据。【课程,分数等】

5.1 常用命令

1.zadd key score member[score member…] #添加score 和element ,element 不可重复 O(logN)
2.zrem key member[member…] #删除元素
3.zscore key member #查询集合元素的分数
4.zincrby key increScore member #增加或则减小元素分数
5.zcard key #返回元素个数

6zrange key start end #返回指定索引范围内升序元素【不包含分数】
7.zrangebyscore key minscore maxscore #指定分数范围内升序元素【不包含分数】
8.zcount key minscore maxscore #返回有序集合内指定分数范围个数
9.zremrangebyrank #删除指定排名内升序元素
10.zrembyrangescore #

5.2 内部编码

ziplist(压缩列表) : 当有序集合的元素个数小于zset-max-ziplistentries配置(默认128个) , 同时每个元素的值都小于zset-max-ziplist-value配
置(默认64字节) 时, Redis会用ziplist来作为有序集合的内部实现, ziplist
可以有效减少内存的使用。
skiplist(跳跃表) : 当ziplist条件不满足时, 有序集合会使用skiplist作
为内部实现, 因为此时ziplist的读写效率会下降。

5.3使用场景

例如视频网站需要对用户上传的视频做排行榜, 榜单的维度可能是多个方面的: 按照时间、 按照播放数量、 按照获得的赞数。 本节使用赞数这个维度, 记录每天用户上传视频的排行榜

zadd user:ranking:2016_03_15 mike 3
zincrby user:ranking:2016_03_15 mike 1 //再获得一个赞
zrem user:ranking:2016_03_15 mike
zrevrangebyrank user:ranking:2016_03_15 0 9//赞数最多的十个用户

猜你喜欢

转载自blog.csdn.net/jcsyl_mshot/article/details/80272331
今日推荐