Redis 的基本数据类型 和 基础应用场景
Redis 的基础应用场景
- 获取中奖用户ID,随机弹出之后集合中就不存在了【set】
- 存储活动中中奖的用户ID,保证同一个用户不会中奖两次【set】
- 存储粉丝列表,value 为粉丝的用户ID,score 是关注时间【zset】
- 存储学生成绩,value 为学生的ID,score 是考试成绩【zset】
- 记录帖子的点赞数、评论数、和点击率【hash】
- 记录用户的帖子ID列表,便于快速显示用户的帖子列表【zset】
- 记录帖子的标题、摘要、作者和封面信息,用于列表展示页【hash】
- 记录帖子的点赞ID列表,评论ID列表,用于显示和去重计数【zset】
- 缓存近期热帖内容,减少数据库压力【hash】
- 记录热榜帖子ID列表,总热榜和分类热榜【zset】
- 收藏和贴子之间的关系【zset】
- 缓存用户的历史行为,过滤恶意行为【zset,hash】
Redis 的基本数据类型
建值对:相当于字典的 key 和 value,支持简单的增删改查操作。
- set/get/exists/del
- mset/mget => 批量键值对
- expire => 设置过期时间
- setex => 5秒后过期,set + expire
- setnx => 如果不存在就创建,如果存在就创建不成功
- incr/incrby => value是整数,可以进行自增,自增是有范围的。
- 获取所有的key:keys *
- 清空所有的数据: flushall
127.0.0.1:6379> ## 单个键值对
127.0.0.1:6379> ## 设置 key 为 name,value 为 laowen
127.0.0.1:6379> set name laowen
OK
127.0.0.1:6379> get name ## 获取
"laowen"
127.0.0.1:6379> exists name ## 检查是否存在
(integer) 1
127.0.0.1:6379> del name ## 删除
(integer) 1
127.0.0.1:6379> get name ## 获取
(nil)
127.0.0.1:6379> set name1 boy ## 设置
OK
127.0.0.1:6379> set name2 girl ## 设置
OK
127.0.0.1:6379> mget name1 name2 # 放回一个列表
1) "boy"
2) "girl"
127.0.0.1:6379> ## 批量添加多个
127.0.0.1:6379> mset name1 boy name2 girl name3 unknow
OK
127.0.0.1:6379> mget name1 name2 name3
1) "boy"
2) "girl"
3) "unknow"
127.0.0.1:6379> ## 设置过期时间
127.0.0.1:6379> set name a
OK
127.0.0.1:6379> get name
"a"
127.0.0.1:6379> expire name 5 # 5秒后过期
(integer) 1
127.0.0.1:6379> get name # 不到5秒
"a"
127.0.0.1:6379> get name # 5秒之后
(nil)
127.0.0.1:6379> ## 5秒后过期,set + expire
127.0.0.1:6379> setex name 5 aa
OK
127.0.0.1:6379> get name
"aa"
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> ## 如果不存在就创建,如果存在就创建不成功
127.0.0.1:6379> setnx name a # 如果不存在就创建
(integer) 1
127.0.0.1:6379> get names
"a"
127.0.0.1:6379> setnx name b # 如果存在就创建不成功
(integer) 0
127.0.0.1:6379> get name # 没有改变
"a"
127.0.0.1:6379> ## 计数
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> incr age
(integer) 21
127.0.0.1:6379> get age
"21"
127.0.0.1:6379> incrby age 5
(integer) 26
127.0.0.1:6379> get age
"26"
list 列表,注意它是链表而不是数组。
Redis的列表结构常用于做异步队列使用。队列是先进先出的数据结构,常用于消息队列和异步逻辑处理,会确保元素的访问顺序性。
当列表弹出最后一个元素之后,该数据结构被自动删除,内存被回收。
【队列:右进左出】
- rpush 尾部追加
- llen 获取长度
- lpop 头部删除
127.0.0.1:6379> ## 添加一个 books 队列
127.0.0.1:6379> rpush books php java net golang
(integer) 4
127.0.0.1:6379> ## books 队列尾部继续添加内容
127.0.0.1:6379> rpush books c
(integer) 5
127.0.0.1:6379> ## books 队列尾部继续添加内容
127.0.0.1:6379> rpush books python
(integer) 6
127.0.0.1:6379> ## books 队列尾部继续添加内容
127.0.0.1:6379> rpush books vue
(integer) 7
127.0.0.1:6379> ## 获取 books 队列的长度
127.0.0.1:6379> llen books
(integer) 7
127.0.0.1:6379> ## 弹出 books 队列的第一个内容
127.0.0.1:6379> lpop books
"php"
127.0.0.1:6379> ## 弹出 books 队列的第一个内容
127.0.0.1:6379> lpop books
"java"
127.0.0.1:6379> ## 弹出 books 队列的第一个内容
127.0.0.1:6379> lpop books
"net"
127.0.0.1:6379> ## 弹出 books 队列的第一个内容
127.0.0.1:6379> lpop books
"golang"
127.0.0.1:6379> ## 弹出 books 队列的第一个内容
127.0.0.1:6379> lpop books
"c"
127.0.0.1:6379> ## 弹出 books 队列的第一个内容
127.0.0.1:6379> lpop books
"python"
127.0.0.1:6379> ## 弹出 books 队列的第一个内容
127.0.0.1:6379> lpop books
"vue"
127.0.0.1:6379> ## 弹出 books 队列的第一个内容
127.0.0.1:6379> lpop books
(nil)
127.0.0.1:6379>
【栈:右进右出】
- rpush 尾部追加
- llen 获取长度
- rpop 从尾部删除
127.0.0.1:6379> ## 添加一个 books 栈
127.0.0.1:6379> rpush books php java net golang
(integer) 4
127.0.0.1:6379> ## 获取 books 栈的长度
127.0.0.1:6379> llen books
(integer) 4
127.0.0.1:6379> ## 弹出栈尾部的内容
127.0.0.1:6379> rpop books
"golang"
127.0.0.1:6379> ## 弹出栈尾部的内容
127.0.0.1:6379> rpop books
"net"
127.0.0.1:6379> ## 弹出栈尾部的内容
127.0.0.1:6379> rpop books
"java"
127.0.0.1:6379> ## 弹出栈尾部的内容
127.0.0.1:6379> rpop books
"php"
127.0.0.1:6379> ## 弹出栈尾部的内容
127.0.0.1:6379> rpop books
(nil)
127.0.0.1:6379>
【慢操作】
【快速列表】
hash 哈希字典
类似与字典,一个key对应一个value。适用于 key为标题,value为内容的存储。当hash移除最后一个元素之后,该数据结构被自动删除,内存被回收。
- hset key filed value 设置单个
- hget key filed 获取单个
- hgetall key 获取所有
- hdel key filed 删除单个
- hlen key 获取长度
- hmset key file value 批量设置
127.0.0.1:6379> ## 设置 name 的哈希、注意 如果字符串中包含空格、需要使用引号
127.0.0.1:6379> hset name wang wangzong
(integer) 1
127.0.0.1:6379> hset name wen wenzong
(integer) 1
127.0.0.1:6379> hset name zhang zhangzong
(integer) 1
127.0.0.1:6379> ## 获取所有
127.0.0.1:6379> hgetall name
1) "wang"
2) "wangzong"
3) "wen"
4) "wenzong"
5) "zhang"
6) "zhangzong"
127.0.0.1:6379> ## 获取长度
127.0.0.1:6379> hlen name
(integer) 3
127.0.0.1:6379> ## 获取单个
127.0.0.1:6379> hget name wen
"wenzong"
127.0.0.1:6379> ## 更新单个,成功返回0
127.0.0.1:6379> hset name wen wenzongbin
(integer) 0
127.0.0.1:6379> hget name wen
"wenzongbin"
127.0.0.1:6379> ## 更新单个,成功返回0
127.0.0.1:6379> hset name wen xiaowen
(integer) 0
127.0.0.1:6379> hgetall name
1) "wang"
2) "wangzong"
3) "wen"
4) "xiaowen"
5) "zhang"
6) "zhangzong"
127.0.0.1:6379> ## 批量 set
127.0.0.1:6379> hmset name zhao zhaozong li lizong fei feizong
OK
127.0.0.1:6379> hgetall name
1) "wang"
2) "wangzong"
3) "wen"
4) "xiaowen"
5) "zhang"
6) "zhangzong"
7) "zhao"
8) "zhaozong"
9) "li"
10) "lizong"
11) "fei"
12) "feizong"
127.0.0.1:6379> hget name wen
"xiaowen"
127.0.0.1:6379> ## 删除单个
127.0.0.1:6379> hdel name wen
(integer) 1
127.0.0.1:6379> hget name wen
(nil)
127.0.0.1:6379>
set 集合
Redis 的集合内部是键值对,是无序的、唯一的。
- sadd key value => 添加
- smembers key => 获取所有
- smembers key value => 检查某个值是否存在
- scard key => 获取长度
- spop key => 随机弹出
127.0.0.1:6379> ## 添加一个,不存在,返回1
127.0.0.1:6379> sadd num 100
(integer) 1
127.0.0.1:6379> ## 添加一个,存在, 返回0
127.0.0.1:6379> sadd num 100
(integer) 0
127.0.0.1:6379> ## 添加多个
127.0.0.1:6379> sadd num 99 89
(integer) 2
127.0.0.1:6379> ## 获取所有
127.0.0.1:6379> ## 和插入的顺序是不一致的,因为 set 是无序的
127.0.0.1:6379> smembers num
1) "89"
2) "99"
3) "100"
127.0.0.1:6379> ## 查询某个值是否存在 存在返回 1
127.0.0.1:6379> sismember num 100
(integer) 1
127.0.0.1:6379> ## 查询某个值是否存在 不存在返回 0
127.0.0.1:6379> sismember num 90
(integer) 0
127.0.0.1:6379> scard num ## 获取长度
(integer) 3
127.0.0.1:6379> spop num ## 随机弹出一个
"100"
127.0.0.1:6379> spop num ## 随机弹出一个
"89"
127.0.0.1:6379> spop num ## 随机弹出一个
"99"
127.0.0.1:6379> spop num
(nil)
zset 有序列表
- zadd key score value => 添加
- zrange key 范围 => 按 score 正序列出,参数为排名范围
- zrevrange key 范围 => 按 score 逆序列出,参数为排名范围
- zcard key => 获取长度,相当于 count()
- zscore key value => 获取指定 value 的 score
- zrank key value => 获取指定 value 的排名
- zrangebyscore key 范围 => 根据 score 范围取值
- zrem key value => 删除指定 value 的 score
127.0.0.1:6379> ## 添加有序列表 zadd key score value
127.0.0.1:6379> ## score:成绩
127.0.0.1:6379> ## key:fan
127.0.0.1:6379> ## value:wen
127.0.0.1:6379> zadd fan 100 wen
(integer) 1
127.0.0.1:6379> zadd fan 99 zhang
(integer) 1
127.0.0.1:6379> zadd fan 101 li
(integer) 1
127.0.0.1:6379> zadd fan 98 zhao
(integer) 1
127.0.0.1:6379> zadd fan 97 jin
(integer) 1
127.0.0.1:6379> ## zrange key 范围
127.0.0.1:6379> ## 按 score 正序取出;参数为范围
127.0.0.1:6379> zrange fan 0 -1
1) "jin"
2) "zhao"
3) "zhang"
4) "wen"
5) "li"
127.0.0.1:6379> ## zrevrange key 范围
127.0.0.1:6379> ## 按 score 逆序取出;参数为范围
127.0.0.1:6379> zrevrange fan 0 -1
1) "li"
2) "wen"
3) "zhang"
4) "zhao"
5) "jin"
127.0.0.1:6379> ## zcard key 获取总数。相当于 count()
127.0.0.1:6379> zcard fan
(integer) 5
127.0.0.1:6379> ## 获取指定 value 的 score
127.0.0.1:6379> ## zscore key value
127.0.0.1:6379> zscore fan wen
"100"
127.0.0.1:6379> ## 获取指定 value 的 排名
127.0.0.1:6379> ## zrank key value
127.0.0.1:6379> zrank fan wen
(integer) 3
127.0.0.1:6379> ## 获取指定范围的数据
127.0.0.1:6379> ## zrangebyscore key 范围
127.0.0.1:6379> zrangebyscore fan 99 100
1) "zhang"
2) "wen"
127.0.0.1:6379> ## 获取指定范围的数据
127.0.0.1:6379> ## zrangebyscore key -inf inf 【只有value】
127.0.0.1:6379> ## zrangebyscore key -inf inf withscores 【value 和 score 同时返回】
127.0.0.1:6379> ## -inf/inf 代表 infinite,无穷大的意思,∞大
127.0.0.1:6379> zrangebyscore fan -inf inf
1) "jin"
2) "zhao"
3) "zhang"
4) "wen"
5) "li"
127.0.0.1:6379> zrangebyscore fan -inf inf withscores
1) "jin"
2) "97"
3) "zhao"
4) "98"
5) "zhang"
6) "99"
7) "wen"
8) "100"
9) "li"
10) "101"
127.0.0.1:6379> zrange fan 0 -1
1) "jin"
2) "zhao"
3) "zhang"
4) "wen"
5) "li"
127.0.0.1:6379> ## 删除 value
127.0.0.1:6379> ## zrem key value
127.0.0.1:6379> zrem fan wen
(integer) 1
127.0.0.1:6379> zrange fan 0 -1
1) "jin"
2) "zhao"
3) "zhang"
4) "li"
127.0.0.1:6379>
Redis 的基本数据类型 和 基础应用场景的更多相关文章
- Redis常用数据类型介绍、使用场景及其操作命令
Redis常用数据类型介绍.使用场景及其操作命令 本文章同时也在cpper.info发布. Redis目前支持5种数据类型,分别是: 1.String(字符串) 2.List(列表) 3.Hash(字 ...
- redis五种数据类型的使用场景
string 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...
- Redis五种数据类型及应用场景
MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加 ...
- 2 万字 + 20张图| 细说 Redis 九种数据类型和应用场景
作者:小林coding 计算机八股文网(操作系统.计算机网络.计算机组成.MySQL.Redis):https://xiaolincoding.com 大家好,我是小林. 我们都知道 Redis 提供 ...
- redis中各种数据类型对应的jedis操作命令
redis中各种数据类型对应的jedis操作命令 一.常用数据类型简介: redis常用五种数据类型:string,hash,list,set,zset(sorted set). 1.String类型 ...
- Redis进阶实践之四Redis的基本数据类型
一.引言 今天正式开始了Redis的学习,如果要想学好Redis,必须先学好Redis的数据类型.Redis为什么会比以前的Memchaed等内存缓存软件使用的更频繁,适用范围更广呢?就是因为R ...
- Redis进阶实践之四Redis的基本数据类型(转载4)
Redis进阶实践之四Redis的基本数据类型 一.引言 今天正式开始了Redis的学习,如果要想学好Redis,必须先学好Redis的数据类型.Redis为什么会比以前的Memchaed等内存缓存软 ...
- Redis,Memcache的区别和具体应用场景
1. Memcached简介 Memcached是以LiveJurnal旗下Danga Interactive公司的Bard Fitzpatric为首开发的高性能分布式内存缓存服务器.其本质上就是一个 ...
- 【Redis】基本数据类型及命令操作(超详细)
一.String 1.1 概述 1.2 相关命令列表 1.3 命令示例 二.List 2.1 概述: 2.2 相关命令列表: 2.3 命令示例: 2.4 链表结构的小技巧: 三.Hashes 3.1 ...
随机推荐
- 【MetaPruning】2019-ICCV-MetaPruning Meta Learning for Automatic Neural Network Channel Pruning-论文阅读
MetaPruning 2019-ICCV-MetaPruning Meta Learning for Automatic Neural Network Channel Pruning Zechun ...
- Java实现 LeetCode 665 非递减数列(暴力)
665. 非递减数列 给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列. 我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 < ...
- Java实现 LeetCode 599 两个列表的最小索引总和(使用hash提高效率)
599. 两个列表的最小索引总和 假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅 ...
- Java实现 蓝桥杯VIP 算法训练 整数平均值
题目描述 编写函数,求包含n个元素的整数数组中元素的平均值.要求在函数内部使用指针操纵数组元素,其中n个整数从键盘输入,输出为其平均值. (样例说明:5为输入数据的个数,3 4 0 0 2 是以空格隔 ...
- Java实现微生物增殖
微生物增殖 假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍). 一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y. ...
- Mac下如何连接linux服务器(SSH)-比较好用的SSH工具推荐
Mac下如何连接linux服务器(SSH) 1.用mac自带终端连接 步骤如下: 打开终端,在顶部shell菜单中选择新建远程连接 在右侧服务器窗口点击+号,添加服务器,输入IP等信息 输入用户名,点 ...
- 使用vw进行移动端适配(nuxt项目)
基于nuxt 2.0.0 一.安装postcss-px-to-viewport npm安装 npm install postcss-px-to-viewport --save-dev 或 yarn安装 ...
- Centos7快速安装RocketMQ
1. 为什么要用MQ 消息队列是一种"先进先出"的数据结构 其应用场景主要包含以下3个方面 应用解耦 系统的耦合性越高,容错性就越低.以电商应用为例,用户创建订单后,如果耦合调用库 ...
- 1.react的基础
1.react:专注于UI得一个js库 2.选择使用框架得原因: 写起来简单方便了,但是从稳定性上考虑得话还是原生js要稳定,所以也有很多公司直接使用原生js,但是从开发周期上来说时间会长 之前再写页 ...
- Flink 如何分流数据
场景 分流方式 如何分流 使用Filter分流 使用Split分流 使用Side Output分流 场景 获取流数据的时候,通常需要根据所需把流拆分出其他多个流,根据不同的流再去作相应的处理. 举个例 ...