Redis的数据结构与应用场景
一、Redis简介
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(set)和有序集合(sorted set)等类型。
二、字符串(String)
1,常用指令
#常用操作
SET key value //存入字符串键值对
MSET key value [key value ...] //批量存储字符串键值对
SETNX key value //当且仅当key不存在,存入value返回1;若key已存在,则不做操作返回0。
GET key //获取一个key对应的value
MGET key [key ...] //批量获取字符串键值
DEL key [key ...] //删除键
#原子加减操作
INCR key //将key中存储的数字值(value为string报错)加1
DECR key //将key中存储的数字值(value为string报错)减1
INCRBY key n //将key中存储的数字值加n
DECRBY key n //将key中存储的数字值减n
2,应用场景
a)单值缓存
- SET key value
- GET key
b)对象缓存
- SET user:1 value(json格式数据)
- MSET user:1:name zs user:1:age 18 user:2:name ls user:2:age 20
采用String类型的对象缓存有两种方式:1.直接缓存整个对象的json;2.采用将key进行分离为user:ID:属性,采用MSET存储,用MGET获取各属性值。
c)分布式锁
- set product:10001 true ex 10 nx
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX seconds :设置失效时间,单位秒
PX milliseconds:设置失效时间,单位毫秒
NX : key不存在时设置value,成功返回OK,失败返回nil
XX : key存在时设置value,成功返回OK,失败返回nil
设置key为product:ID过期时间为10s,如果当前key已经存在就会直接返回nil。
d)计数器
- INCR aritcle:readcount:{文章id}
- GET aritcle:readcount:{文章id}
e)分布式系统全局序列号
- INCRBY orderId 10
三、哈希(Hash)
1,常用命令
#hash常用操作
HSET key field value //存储一个哈希表key的键值
HSETNX key field value //存储一个不存在的哈希表key的键值
HMSET key field value [field value...] //在一个哈希表key中存储多个键值对
HGET key field //获取哈希表key对应的field键值
HMGET key field [field ...] //批量获取哈希表key中多个field键值
HDEL key field [field ...] //删除哈希表key中的field键值
HLEN key //返回哈希表key中field的数量
HGETALL key //返回哈希表key中所有的键值
HINCRBY key field n //为哈希表key中field键的值加上增量n
2,应用场景
a)对象存储
- HMSET user 1:name zs 1:age 20
- HMGET user 1:name 1:age
当需要存储的对象不大时,可以采用固定的key,对应的field为ID:属性,采用HMSET的方式,这样就能将所有的对象存储在同一个key中;
当需要存储的对象比较大时,可以将key进行动态分离开,例如:设置key为user:序号,序号为0~1000,每个存储对象根据id%序号,确定当前对象分配到哪个key中。
b)购物车
定义:用户id为key,商品id为field,商品数量为value
- 添加商品:hset cart:1001 1100 1
- 添加数量:hincrby cat:1001 1100 1
- 商品总数:hlen cart:1001
- 删除商品:hdel cart:1001 1100
- 获取购物车所有商品:hgetall cart:1001
3,hash结构优缺点
a)优点
- 同类数据归类整合储存,方便数据管理
- 相比String操作消耗内存与cpu更小
- 相比String存储更省空间
b)缺点
- 过期功能不能使用在field上,只能用在key上
- Redis集群架构下不适合大规模使用(容易造成数据倾斜)
四、列表(list)
1,常用命令
#List常用操作
LPUSH key value [value ...] //将一个或多个值value插入到key列表的表头(最左边),最后的值在最前面
RPUSH key value [value ...] //将一个或多个值value插入到key列表的表尾(最右边)
LPOP key //移除并返回key列表的头元素
RPOP key //移除并返回key列表的尾元素
LRANGE key start stop //返回列表key中指定区间内的元素,区间以偏移量start和stop指定,从0开始
BLPOP key [key ...] timeout //从key列表表头弹出一个元素,没有就阻塞timeout秒,如果timeout=0则一直阻塞
BRPOP key [key ...] timeout //从key列表表尾弹出一个元素,没有就阻塞timeout秒,如果timeout=0则一直阻塞
2,应用场景
a)常用数据结构
- stack(栈) = LPUSH + LPOP -> FIFO
- queue(队列) = LPUSH + RPOP
- Blocking MQ(阻塞队列) = LPUSH + BRPOP
b)微博消息和微信公众号消息
用户A关注了公众号B和公众号C
- B发微博,消息ID为1001。LPUSH msg:AID 1001
- C发微博,消息ID为1002。LPUSH msg:AID 1002
- A查看微博前五条。LRANGE msg:AID 0 4
五、集合(Set)
1,常用命令
#Set常用操作
SADD key member [member ...] //往集合key中存入元素,元素存在则忽略,若key不存在则新建
SREM key member [member ...] //从集合key中删除元素
SMEMBERS key //获取集合key中所有元素
SCARD key //获取集合key中的元素个数
SISMEMBER key member //判断member元素是否存在于集合key中
SRANDMEMBER key [count] //从集合key中随机选出count个元素,元素不从key中删除
SPOP key [count] //从集合key中随机选出count个元素,元素从key中删除
#Set运算操作
SINTER key [key ...] //交集运算
SINTERSTORE destination key [key ...] //将交集结果存入新集合destination中
SUNION key [key ...] //并集运算
SUNIONSTORE destination key [key ...] //将并集结果存入新集合destination中
SDIFF key [key ...] //差集运算
SDIFFSTORE destination key [key ...] //将差集结果存入新集合destination中
2,应用场景
a)微信微博点赞,收藏,标签
- 点赞。SADD like:{消息ID} {用户ID}
- 取消点赞。SREM like:{消息ID} {用户ID}
- 检查用户是否点赞。SISMEMBER like:{消息ID} {用户ID}
- 获取点赞的用户列表。SMEMBERS like:{消息ID}
- 获取点赞用户数。SCARD like:{消息ID}
b)微博微信关注模型
- A关注的人:aSet -> {b,c,d}
- B关注的人:bSet -> {a,c,d,e}
- C关注的人:cSet -> {a,b,d,e,f}
- A和B共同关注的人:SINTER aSet bSet ->{c,d}
- A关注的人也关注C:A可能认识的人:SDIFF bSet aSet -> {a,e}
- SISMEMBER cSet b
- SISMEMBER cSet d
六、有序集合(sorted set)
1,常用命令
#ZSet常用操作
ZADD key score member [[score member]...] //往有序集合key中加入带分值元素
ZREM key member [member...] //往有序集合key中删除元素
ZSCORE key member //返回有序集合key中元素member的分值
ZINCREBY key increment member //为有序集合key中元素member的分值加上increment
ZCARD key //返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start下标到stop下标的元素
#ZSet运算操作
ZUNIONSTORE destkey numberkeys key [key...] //并集计算(相同元素分值相加),numberkeys一共多少个key,WEIGHTS每个key对应的分值乘积
ZINTERSTORE destkey numberkeys key [key...] //交集计算(相同元素分值相加),numberkeys一共多少个key,WEIGHTS每个key对应的分值乘积
2,应用场景
a)微博热搜榜
- 点击新闻:ZINCRBY hotNews:210218 1 春节零售餐饮消费超8000亿元 (将当前新闻的分值加1)
- 展示当日排行前十:ZRERANGE hotNews:210218 0 9 WITHSCORES
- 七日搜索榜单计算:ZUNIONSTORE hotNews:210212-210218 7 hotNews:210212 hotNews:210213 ... hotNews:210218
- 展示七日排行前七:ZREVRANGE hotNews:210212-210218 0 9 WITHSCORES
Redis的数据结构与应用场景的更多相关文章
- 细说Redis(一)之 Redis的数据结构与应用场景
这一篇文章主要介绍Redis的数据结构与应用场景 NOSQL之Redis Redis是一款由key-value存储的软件.说起NOSQL,有文档型.键值型.列型存储.图形数据库.其中,在简单的读写性能 ...
- 2017-4-20/Redis的数据结构及应用场景
1. 谈谈你对redis的理解,它的应用场景. Redis是一个key-value存储系统,它支持存储的value类型包括string字符串.list链表.set集合.sorted Set有序集合和h ...
- php数组去重、魔术方法、redis常用数据结构及应用场景
一.用函数对数组进行去重的方法 1.arrau_unique函数的作用 移除数组中重复的值. 将值作为字符串进行排序,然后保留每个值第一次出现的健名,健名保留不变. 第二个参数可以选择排序方式: SO ...
- 深度分析:Redis 的数据结构及其使用场景分析,原来这么简单?
Redis基础数据结构有哪些? 一.String(字符串) 在任何一种编程语言里,字符串String都是最基础的数据结构, 那你有想过Redis中存储一个字符串都进行了哪些操作嘛? 在Redis中St ...
- redis的数据结构、使用场景、持久化方式以及常见面试问题
一.redis中的数据结构 1.字符串(String) SET key value //存入字符串键值对 MSET key value[key value...] //批量存储字符串键值对 SETNX ...
- Redis中5种数据结构的使用场景介绍
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/108.html?1455861435 一.redis 数据结构使用场景 原 ...
- Redis中5种数据结构的使用场景
一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 ...
- Redis数据结构以及应用场景
1. Redis数据结构以及应用场景 1.1. Memcache VS Redis 1.1.1. 选Memcache理由 系统业务以KV的缓存为主,数据量.并发业务量大,memcache较为合适 me ...
- Redis 中 5 种数据结构的使用场景介绍
这篇文章主要介绍了Redis中5种数据结构的使用场景介绍,本文对Redis中的5种数据类型String.Hash.List.Set.Sorted Set做了讲解,需要的朋友可以参考下 一.redis ...
随机推荐
- 十三:SpringBoot-基于Yml配置方式,实现文件上传逻辑
SpringBoot-基于Yml配置方式,实现文件上传逻辑 1.文件上传 2.搭建文件上传界面 2.1 引入页面模板Jar包 2.2 编写简单的上传页面 2.3 配置页面入口 3.SpringBoot ...
- MySql(二)索引的设计与使用
MySql(二)索引的设计与使用 一.索引概述 二.设计索引的原则 三.BTREE索引与HASH索引 一.索引概述 所有Mysql列类型都可以被索引,对相关列使用索引时提高select操作性能的最佳途 ...
- 码一次前后台post请求交互,以及接口的使用,json数据格式的传递
近几天,公司疯狂加班,然后补做了很多功能,很多东西虽然是自己熟悉的,但是却不会上手,动手实践能力仍需加强,对此对一些代码记录,留待学习和总结. 简单描述功能 具体实现 前台JSP.JS.后台actio ...
- 前端html基础学习笔记二
表单 1 : 表单标签 <form></form> 属性 : action = '接口地址' method = 'get / post' name = '表单名称' 2 : 表 ...
- Web程序设计基础期末大作业——模仿QQ飞车手游S联赛官网编写的网页
QQ飞车手游是我非常喜欢的游戏,也是我现在为数不多的常在玩的游戏,刚好我Web程序设计基础的大作业是要做一套网站,我就借此机会模仿飞车S联赛官网的页面自己做了一个网页,又加了一些自己的元素,由于我做这 ...
- Codeforces Round #673 (Div. 2) B. Two Arrays(数学)
题目链接:https://codeforces.com/contest/1417/problem/B 题意 定义 $f(a)$ 为数组 $a$ 中满足: $i < j$ $a_i + a_j = ...
- Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round) A. Contest for Robots(数学)
题意: n 道题,2 个答题者,已知二者的做题情况,你是受贿裁判,可以给每题指定分值(≥1),求甲乙分数(甲>乙)相差最小时最大分值的最小值. 思路: 统计只有甲或乙做出的题目数. 加一取下整判 ...
- 2019牛客暑期多校训练营(第七场)B Irreducible Polynomial
传送门 题意: 给你一个n次n+1项式(An*X^n+A(n-1)*X^(n-1)...A*X+A0),将系数An都给你,问你这个多项式是不是一个不可约多项式,可约多项式就是类型(x+1)*(x+2) ...
- Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords (贪心)
题意:你有\(a\)个树枝和\(b\)个钻石,\(2\)个树枝和\(1\)个钻石能造一个铁铲,\(1\)个树枝和\(2\)个钻石能造一把剑,问最多能造多少铲子和剑. 题解:如果\(a\le b\),若 ...
- Codeforces Round #650 (Div. 3) F1. Flying Sort (Easy Version) (离散化,贪心)
题意:有一组数,每次操作可以将某个数移到头部或者尾部,问最少操作多少次使得这组数非递减. 题解:先离散化将每个数映射为排序后所对应的位置,然后贪心,求最长连续子序列的长度,那么最少的操作次数一定为\( ...