Redis面试之传统五大数据类型的落地应用详解
前提:安装redis6.0.8
Redis官网:https://redis.io/
Redis中文网:http://www.redis.cn/
redis基本类型:
- string
- list
- set
- zset(sorted set)
- hash
注意1:命令不区分大小写,但是key是区分大小写的。
127.0.0.1:6379> set K1 V1
OK
127.0.0.1:6379> set k1 v2
OK
127.0.0.1:6379> get K1
"V1"
127.0.0.1:6379> get k1
"v2"
127.0.0.1:6379>
K1和k1的值是不同的。
注意2:help @+类型名词,查询命令。例如help @list
127.0.0.1:6379> help @listBLPOP key [key ...] timeoutsummary: Remove and get the first element in a list, or block until one is availablesince: 2.0.0BRPOP key [key ...] timeoutsummary: Remove and get the last element in a list, or block until one is availablesince: 2.0.0BRPOPLPUSH source destination timeoutsummary: Pop a value from a list, push it to another list and return it; or block until one is availablesince: 2.2.0LINDEX key indexsummary: Get an element from a list by its indexsince: 1.0.0LINSERT key BEFORE|AFTER pivot valuesummary: Insert an element before or after another element in a listsince: 2.2.0LLEN keysummary: Get the length of a listsince: 1.0.0LPOP keysummary: Remove and get the first element in a listsince: 1.0.0
1.string类型使用场景?
常规用法:
SET key value
GET key
127.0.0.1:6379> set k1 ct1
OK
127.0.0.1:6379> set k2 ct2
OK
127.0.0.1:6379> get k1
"ct1"
同时设置/获取多个键值
MSET key value [key value…]
MGET key [key…]
127.0.0.1:6379> mset k3 ct3 k4 ct4
OK
127.0.0.1:6379> mget k3 k4
1) "ct3"
2) "ct4"
数值增减
1.递增数字: INCR key(可以不用预先设置key的数值。如果预先设置key但值不是数字,则会报错)
127.0.0.1:6379> incr d1
(integer) 1
127.0.0.1:6379> incr d1
(integer) 2
127.0.0.1:6379> incr d1
(integer) 3
127.0.0.1:6379> incr d1
(integer) 4
127.0.0.1:6379>
增加指定的整数: INCRBY key increment
127.0.0.1:6379> incrby d1 2
(integer) 6
127.0.0.1:6379> incrby d1 2
(integer) 8
递减数值: DECR key
127.0.0.1:6379> decr d1
(integer) 7
127.0.0.1:6379> decr d1
(integer) 6
127.0.0.1:6379> decr d1
(integer) 5
减少指定的整数: DECRBY key decrement
127.0.0.1:6379> decrby d1 2
(integer) 3
127.0.0.1:6379> decrby d1 2
(integer) 1
获取字符串长度:STRLEN key
127.0.0.1:6379> strlen d1
(integer) 1
分布式锁
SETNX key value
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX:key在多少秒之后过期
PX:key在多少毫秒之后过期
NX:当key不存在的时候,才创建key,效果等同于setnx
XX:当key存在的时候,覆盖key
127.0.0.1:6379> set k1 v1 EX 20
OK
127.0.0.1:6379> ttl k1
(integer) 17
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> ttl k1
(integer) 11
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> ttl k1
(integer) 6
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> ttl k1
(integer) -2
应用场景
假如电商网站,某种商品,喜欢这个商品的人就点一下赞,不喜欢的就踩一下,分别记录喜欢和不喜欢的人数。
还有假如发布博客的点赞数,收藏的文章数据,商品编号,订单号的生成等等。
我们都可以这么写
127.0.0.1:6379> incr items:10
(integer) 1
127.0.0.1:6379> incr items:10
(integer) 2
127.0.0.1:6379> incr items:10
(integer) 3
127.0.0.1:6379> incr items:10
(integer) 4
127.0.0.1:6379> get items:10
"4"
2.hash类型使用场景?
Redis的Hash类型相当于Java中Map<String, Map<key, value>>
一次设置一个字段值 HSET key field value
127.0.0.1:6379> hset user id 110
(integer) 1
127.0.0.1:6379> hset user name ct
(integer) 1
一次获取一个字段值 HGET key field
127.0.0.1:6379> hget user id
"110"
127.0.0.1:6379> hget user name
"ct"
127.0.0.1:6379>
一次设置多个字段值 HMSET key field value [field value …]
127.0.0.1:6379> hmset user age 18 sex man
OK
一次获取多个字段值 HMGET key field [field …]
127.0.0.1:6379> hmget user age sex
1) "18"
2) "man"
获取所有字段值 HGETALL key
127.0.0.1:6379> hgetall user
1) "id"
2) "110"
3) "name"
4) "ct"
5) "age"
6) "18"
7) "sex"
8) "man"
获取某个key内的全部数量 HLEN
127.0.0.1:6379> hlen user
(integer) 4
删除一个key HDEL
127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hgetall user
1) "id"
2) "110"
3) "name"
4) "ct"
5) "sex"
6) "man"
应用场景:
电商项目里的购物车,订餐等
购物车编号:shopcar:01
新增商品:shop001
127.0.0.1:6379> hset shopcar:01 shop001 1
(integer) 1
新增商品 :shop002
127.0.0.1:6379> hset shopcar:01 shop002 1
(integer) 1
增加商品数量:shop001
127.0.0.1:6379> hincrby shopcar:01 shop001 1
(integer) 2
商品总数
127.0.0.1:6379> hlen shopcar:01
(integer) 2
查看购物车信息
127.0.0.1:6379> hgetall shopcar:01
1) "shop001"
2) "2"
3) "shop002"
4) "1"
3.list类型使用场景
向列表左边添加元素 LPUSH key value [value …]
127.0.0.1:6379> lpush list1 1 2 2 3 3 4 5
(integer) 7
127.0.0.1:6379> lrange list1 0 -1 //全部遍历
1) "5"
2) "4"
3) "3"
4) "3"
5) "2"
6) "2"
7) "1"
有序有重复
向列表右边添加元素 RPUSH key value [value …]
127.0.0.1:6379> rpush list1 6
(integer) 8
127.0.0.1:6379> rpush list1 7
(integer) 9
127.0.0.1:6379> rpush list1 8
(integer) 10
127.0.0.1:6379> lrange list1 0 -11) "5"2) "4"3) "3"4) "3"5) "2"6) "2"7) "1"8) "6"9) "7"
10) "8"
查看列表 LRANGE key start stop
lrange list1 0 -1 //全部遍历
获取列表中元素的个数 LLEN key
127.0.0.1:6379> llen list1
(integer) 10
应用场景:
微信文章订阅公众号:一个人可以订阅多个公众号,假如用户【likeauthor:L001 】分别订阅了【11】和【22】作者的文章,就把【11】和【22】放到用户【likeauthor:L001 】list里,然后展示给用户。
127.0.0.1:6379> lpush likeauthor:L001 11 22
(integer) 2
127.0.0.1:6379> lrange likeauthor:L001 0 -1
1) "22"
2) "11"
4.set类型使用场景
无序无重复
添加元素 SADD key member [member …]
127.0.0.1:6379> sadd set1 2 3 3 5 4 1 5
(integer) 5
127.0.0.1:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
删除元素 SREM key member [member …]
127.0.0.1:6379> srem set1 5
(integer) 1
127.0.0.1:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
获取集合中的所有元素 SMEMBERS key
127.0.0.1:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
判断元素是否在集合中 SISMEMBER key member
127.0.0.1:6379> sismember set1 2
(integer) 1
获取集合中的元素个数 SCARD key
127.0.0.1:6379> scard set1
(integer) 4
从集合中随机弹出一个元素,元素不删除 SRANDMEMBER key [数字]
127.0.0.1:6379> srandmember set1//不写默认是1个,写几个就是几个
"4"
127.0.0.1:6379> srandmember set1
"2"
127.0.0.1:6379> scard set1
(integer) 4
从集合中随机弹出一个元素,出一个删一个 SPOP key[数字]
127.0.0.1:6379> spop set1 //不写默认是1个,写几个就是几个
"1"
127.0.0.1:6379> scard set1
(integer) 3
集合运算
集合的差集运算A - B
属于A但不属于B的元素构成的集合
SDIFF key [key …]
127.0.0.1:6379> sadd set1 1 2 3
(integer) 3
127.0.0.1:6379> sadd set2 2 3 4
(integer) 3
127.0.0.1:6379> sdiff set1 set2
1) "1"
集合的交集运算A ∩ B
属于A同时也属于B的共同拥有的元素构成的集合
SINTER key [key …]
127.0.0.1:6379> sinter set1 set2
1) "2"
2) "3"
集合的并集运算A U B
属于A或者属于B的元素合并后的集合
SUNION key [key …]
127.0.0.1:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
应用场景1:
微信小程序抽奖,发布某个抽奖活动,点击【立即参与】,就会把当前用户的ID存到set里,然后用spop命令
10个人,抽3个二等奖,1个一等奖
127.0.0.1:6379> sadd set3 1 2 3 4 5 6 7 8 9 10
(integer) 10
127.0.0.1:6379> spop set3 3
1) "5"
2) "7"
3) "10"
127.0.0.1:6379> spop set3 1
1) "1"
127.0.0.1:6379> smembers set3
1) "2"
2) "3"
3) "4"
4) "6"
5) "8"
6) "9"
应用场景2:
微信朋友圈点赞,发布一条朋友圈,好久点赞了,就把好友id放到set里
127.0.0.1:6379> sadd message:01 user1 user2
(integer) 2
127.0.0.1:6379> smembers message:01
1) "user2"
2) "user1"
取消点赞
127.0.0.1:6379> srem message:01 user1
(integer) 1
127.0.0.1:6379> smembers message:01
1) "user2"
展现点赞过的用户
127.0.0.1:6379> smembers message:01
1) "user2"
点赞用户统计,就是常见红色数字
127.0.0.1:6379> scard message:01
(integer) 1
判断某个朋友是否对你点赞过
127.0.0.1:6379> sismember message:01 user3
(integer) 0
应用场景3:
微博好友共同关注的人
127.0.0.1:6379> sadd s1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd s2 3 4 5 6 7
(integer) 5
127.0.0.1:6379> sinter s1 s2
1) "3"
2) "4"
3) "5"
我关注的人也关注它(大家爱好相同)
127.0.0.1:6379> sadd s1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd s2 3 4 5 6 7
(integer) 5
127.0.0.1:6379> sismember s1 3
(integer) 1
127.0.0.1:6379> sismember s2 3
(integer) 1
QQ内推,可能认识的人
127.0.0.1:6379> sadd s1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd s2 3 4 5 6 7
(integer) 5
127.0.0.1:6379> sdiff s1 s2
1) "1"
2) "2"
127.0.0.1:6379> sdiff s2 s1
1) "6"
2) "7"
5.zset类型使用场景
向有序集合中加入一个元素和该元素的分数
添加元素 ZADD key score member [score member …]
127.0.0.1:6379> zadd zset1 100 mov1 80 mov2
(integer) 2
按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素 ZRANGE key start stop [WITHSCORES]
127.0.0.1:6379> zrange zset1 0 -1
1) "mov2"
2) "mov1"
获取元素的分数 ZSCORE key member
127.0.0.1:6379> zscore zset1 mov1
"100"
删除元素 ZREM key member [member …]
127.0.0.1:6379> zrem zset1 mov1
(integer) 1
127.0.0.1:6379> zrange zset1 0 -1
1) "mov2"
获取指定分数范围的元素 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
127.0.0.1:6379> zrange zset1 0 -1
1) "mov2"
127.0.0.1:6379> zadd zset1 70 mov3
(integer) 1
127.0.0.1:6379> zadd zset1 60 mov4
(integer) 1
127.0.0.1:6379> zadd zset1 50 mov5
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE zset1 60 70
1) "mov4"
2) "mov3"
增加某个元素的分数 ZINCRBY key increment member
127.0.0.1:6379> ZINCRBY zset1 5 mov5
"55"
获取集合中元素的数量 ZCARD key
127.0.0.1:6379> zcard zset1
(integer) 4
获得指定分数范围内的元素个数 ZCOUNT key min max
127.0.0.1:6379> zcount zset1 55 70
(integer) 3
按照排名范围删除元素 ZREMRANGEBYRANK key start stop
127.0.0.1:6379> ZREMRANGEBYRANK zset1 3 4
(integer) 1
127.0.0.1:6379> ZRANGE zset1 0 -1
1) "mov5"
2) "mov4"
3) "mov3"
获取元素的排名
从小到大 ZRANK key member
127.0.0.1:6379> ZRANK zset1 mov3//索引从0开始的
(integer) 2
从大到小 ZREVRANK key member
127.0.0.1:6379> ZREVRANK zset1 mov3//索引从0开始的
(integer) 0
应用场景:
1.定义商品销售排行榜,key为goods,分数为销售量
商品编号1001销量9,商品编号1002销售15
127.0.0.1:6379> zadd goods 9 1001 15 1002
(integer) 2
客户买了2件1001,销量+2
127.0.0.1:6379> zincrby goods 2 1001
"11"
求商品销售量前10名
127.0.0.1:6379> zrange goods 0 9 withscores
1) "1001"
2) "11"
3) "1002"
4) "15"
2.抖音热搜
点击视频
127.0.0.1:6379> ZINCRBY hotvcr 1 mov1
"1"
127.0.0.1:6379> ZINCRBY hotvcr 1 mov2
"1"
127.0.0.1:6379> ZINCRBY hotvcr 5 mov1
"6"
127.0.0.1:6379> ZINCRBY hotvcr 11 mov2
"12"
展示当日排行榜前10条
127.0.0.1:6379> ZREVRANGE hotvcr 0 9 withscores
1) "mov2"
2) "12"
3) "mov1"
4) "6"
Redis面试之传统五大数据类型的落地应用详解相关推荐
- Redis数据库及五种数据类型的常用命令详解
一.理论部分 1.什么是redis Redis(Remote Dictionary Server ),是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value结 ...
- MySQL数据类型以及基本使用详解
MySQL数据类型以及基本使用详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL服务器的主要组件 我们知道MySQL的主要组件主要是由服务端(mysqld)和客户端 ...
- java原生类型没有封装_Java基本数据类型与封装类型详解(int和Integer区别)
Java基本数据类型与封装类型详解(int和Integer区别) 发布于 2020-4-19| 复制链接 摘记: int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Int ...
- DBus glib 各数据类型接收与发送详解—C语言(3)
DBus glib 各数据类型接收与发送详解-C语言(3) 动机 前置知识 正文 Python 测试服务 使用 C 实现复杂数据类型的传递 DICT_DICT ObjectPath_Dict_Stru ...
- java 封装表单数据类型_Java基本数据类型与封装类型详解(int和Integer区别)
int是java提供的8种原始数据类型之一. Java为每个原始类型提供了封装类,Integer是java为int提供的封装类(即Integer是一个java对象,而int只是一个基本数据类型).in ...
- 【面试篇】ConcurrentHashMap1.7和1.8详解对比
ConcurrentHashMap1.7和1.8详解对比 [面试篇]数据结构-哈希表 [面试篇]HashMap常见面试题目 [面试篇]HashMap1.7和HashMap1.8的详细区别对比 [面试篇 ...
- 上手Redis系列(六):超全Geospatial特殊类型详解(地理位置)
学习Redis之前,我还是觉得我务必跟你说一声,也是在我文章之中说的很多的一句话,我想也会适用于学习Redis,那就是在接触文章里的Reids命令时,不用试图去记这些命令 ,用到时去看API帮助文档即 ...
- python numpy dtype object_关于Numpy数据类型对象(dtype)使用详解
常用方法 #记住引入numpy时要是用别名np,则所有的numpy字样都要替换 #查询数值类型 >>>type(float) dtype('float64') # 查询字符代码 &g ...
- 面试官都在问 | Linux命令mpstat详解
面试官都在问 | Linux命令mpstat详解 1. mpstat的基本用法 mpstat的全称为Multiprocessor Statistics,是一款常用的多核CPU性能分析工具,用来实时查询 ...
最新文章
- pandas使用replace函数替换dataframe中的值:replace函数对dataframe中的多个值进行替换、即一次性同时对多个值进行替换操作
- Fiddler抓包使用教程-过滤
- Diango 模板层
- php5和php7的bccomp计算精度区别
- 全国计算机一级考试介绍难不难,全国计算机一级考试内容 计算机一级考试难吗...
- codeforces 703B
- cobaltstrike生成一个原生c,然后利用xor加密解密执行
- [css] margin和padding使用的场景有哪些?
- 带你吃透分布式的精髓!
- 【面试经验】关于BERT,面试官们都怎么问
- bzoj4009: [HNOI2015]接水果
- SLAM--BA优化
- matlab gui系统设计,matlabgui系统设计
- 原生Android用不了電信4g,给初中生准备的手机,在深圳地区用中国电信4G体验多亲Qin2 AI助手,开箱和使用体验...
- 计算机内存不足提示栻框,【计算机】CIMS概论6.ppt
- 【教程】用微信创建生日提醒
- 国家开放大学专科计算机应用实训项目,国家开放大学电大专科《微机系统与维护》网络课实训1实训3作业及答案.docx...
- linux中exec的用法
- 多多成稿作品网www.no1paper.cn测评
- 本地化翻译软件测试,本地化测试 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...