redis相关数据结构基础总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值