redis支持五种数据结构 string(字符串), hash(哈希),list(列表),set(集合),zset(有序集合)
key-value形式存储内存数据库,操作redis相当于操作unordered_map, unordered_map内部实现了哈希表,查找速度非常快
redis存储key没有采用map 红黑树平衡二叉搜索树形式,Olog(N)时间负责度查询速度很快的,redis对key数据进行存储或者查找时候,key需要对每一个
节点进行字符比较速度会很慢的;使用hash(即unordered_map),就避免跟每一个节点进行比较的操作
泛型支持string,lis,set,zset,hash 数据结构如下:
#include<unordered_map>
#include<unordered_set>
#include<set>
#include<string>
using namespace std;
//string
unordered_map<string, string> strings;
//list
unordered_map<string, list<string>> lists;
//set
unordered_map<string, unordered_set<string>> sets;
//zset
unordered_map<string, skiplist<string, string>> zsets;
//hash
unordered_map < string, unordered_map<string, string> hases;
redis字符串采用非c结构中的字符串,是一个二进制安全的字符串(不会被特殊字符‘\0’隔断);string中包含长度信息来标识字符串长度
如何操作redis呢?
redis采用cs结构模式,采用resp协议进行通信,客户通过请求响应来操作redis
client----------->server redis unordered_map<string,T> resp请求
client<---------- server redis响应 resp响应
redis数据存储规则
string结构及应用
SET key val // 设置key的value值
GET key //获取key的value值
INCR key //执行原子加一的操作
INCRBY key increment // 执行原子加一个整数操作
DECR key // 执行原子减一操作
DECRBY key decrement //执行原子减一个整数的操作
SETNX key value //如果key不存在,等同SET命令,当key存在,不进行操作
DEL key //删除key val键值对
作用
设置单值: set hello world
存储对象 : set role:100001 '{["name"]:"zhangsan",["age"]:10}'
累加器:incr reads //统计阅读数
分布式锁: setnx lock 客户唯一标识 //获取锁
操作临界资源 del lock
list结构及应用
LPUSH key value //队列左侧入队一个或多个元素
LPOP key // 从队列左侧弹出一个元素
RPUSH key value //从队列右侧入队一个或多个元素
RPOP key //从队列的右侧弹出一个元素
LRANGE key start end //返回队列从start和end之间的元素
LREM key count value //从存有key的列表中移除前count次出现的值为value的元素
BRPOP key timeout //它是RPOP的阻塞版本,因为这个命令会在给定list无法弹出任何元素的时候阻塞连接
应用
栈(先进后出 FILO first in last out) LPUSH+LPOP 或者 RPUSH+RPOP
队列(先进先出) LPUSH+RPOP 或者 RPUSH+LPOP
阻塞队列(blocking queue) LPUSH+BRPOP 或者 RPUSH+BLPOP 阻塞在当前的连接上,命令执行上的
朋友圈推送消息 :
lpush role:10002 '{["name"]:"zhangsan", ["age"]:15}'
lrange role:10002 0 9
hash结构与应用
HGET key filed //获取key对应的hash的filed对应的值
HSET key filed //设置key对应的hash中的filed对应的值
HMSET key filed1 value1 field2 value2 ... filedn valuen //设置多个hash键值对
HMGET key filed1 filed2...filedn
HINCRBY key filed increment //给key对应hash中的field对应的值加一个整数值
HLEN key //获取key对应的hash有多少个键值对
HDEL key field //删除key对应的hash的键值对,该键为field
应用
hmset role:10001 name zhangsan age 15
与string 比较,hset对于修改数据中某一个键值对更快速,如果使用string修改需要取出字段信息,在修改字段中某一项数据
hash与list进行混合使用
id为key , 商品id为filed ,商品数量 value
添加商品
hset mycart:10001 40001 1
lpush myitem:10001 40001
增加数量
hincrby mycart:10001 40001 1
hincrby mycart:10001 40001 -1 //减少数量1
显示所有物品数量
hlen mycart:10001
删除商品:
hdel mycart:10001 40001
lrem myitem:10001 1
获取所有物品:
lrange myitem:10001 0 -1
hget mycart:10001
set结构和应用
SADD key member [member ...] //添加一个或多个指定member元素到集合key中
SCARD key //计算集合元素的个数
SMEMBERS key // 集合key中元素
SISMEMBER key member //返回成员member是否是存储集合key的成员
SRANDMEMBER key [count] //随机返回key集合的一个或者多个元素,不删除这些元素
SPOP key [count] //从存储在key的集合中移除并返回一个或多个随机元素
SDIFF key [key ...] //返回一个集合与给定集合的差集的元素
SINTER key [key ...] //返回指定所有的集合的成员的交集
SUNION key [key... ] //返回给定的多个集合中的所有成员
应用:
抽奖添加多个用户 sadd award:1 1001 1002 1003 1004
查看所有参加抽奖有效用户 smembers award:1
抽取多个用户 SRANDMEMBER award:1 2
抽奖三等奖3名 SPOP award:1 3 二等奖2名 SPOP award:1 2
共同关注 SINTER follow:a follow:c
可能认识的人 sdiff follow:a follow:c
zset结构及应用
ZADD key [nx|xx] [ch] [INCR] score member [score member ...] //添加到键为key有序集合(sorted set)里面
ZREM key member [member ...] // 从键为key有序集合中删除member的键值对
ZSCORE key member //返回有序集key中,成员member的score值
ZINCRBY key increment member //有序集key的成员member的score值加上增量increment
ZCARD key //返回key的有序集元素个数
ZRANK key member //返回有序集key中成员member的排名
ZRANGE key start stop [withscores] //返回存储在有序集合key中的指定范围的元素
ZREVRANGE key start stop [withscores] //返回有序集key中,指定区间内的成员逆序
应用
热榜:
ZINCRBY hot:1 1 10002
ZINCRBY hot:1 1 10003
ZINCRBY hot:1 1 10004
获取排行
ZREVRANGE hot:1 0 2 withscores