3.redis 都有哪些数据类型?分别在哪些场景下使用比较合适?
作者:中华石杉
面试题
redis 都有哪些数据类型?分别在哪些场景下使用比较合适?
面试官心理分析
除非是面试官感觉看你简历,是工作 3 年以内的比较初级的同学,可能对技术没有很深入的研究,面试官才会问这类问题。否则,在宝贵的面试时间里,面试官实在不想多问。
其实问这个问题,主要有两个原因:
- 看看你到底有没有全面的了解 redis 有哪些功能,一般怎么来用,啥场景用什么,就怕你别就会最简单的 KV 操作;
- 看看你在实际项目里都怎么玩儿过 redis。
要是你回答的不好,没说出几种数据类型,也没说什么场景,你完了,面试官对你印象肯定不好,觉得你平时就是做个简单的 set 和 get。
面试题剖析
redis 主要有以下几种数据类型:
- string
- hash
- list
- set
- sorted set
string
这是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存。
set college szu
hash
这个是类似 map 的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存在 redis 里,然后每次读写缓存的时候,可以就操作 hash 里的某个字段。
hset person name bingo
hset person age 20
hset person id 1
hget person name
person = {
"name": "bingo",
"age": 20,
"id": 1
}
list
list 是有序列表,这个可以玩儿出很多花样。
比如可以通过 list 存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的东西。
比如可以通过 lrange 命令,读取某个闭区间内的元素,可以基于 list 实现分页查询,这个是很棒的一个功能,基于 redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能高,就一页一页走。
# 0开始位置,-1结束位置,结束位置为-1时,表示列表的最后一个位置,即查看所有。
lrange mylist 0 -1
比如可以搞个简单的消息队列,从 list 头怼进去,从 list 尾巴那里弄出来。
lpush mylist 1
lpush mylist 2
lpush mylist 3 4 5 # 1
rpop mylist
set
set 是无序集合,自动去重。
直接基于 set 将系统里需要去重的数据扔进去,自动就给去重了,如果你需要对一些数据进行快速的全局去重,你当然也可以基于 jvm 内存里的 HashSet 进行去重,但是如果你的某个系统部署在多台机器上呢?得基于 redis 进行全局的 set 去重。
可以基于 set 玩儿交集、并集、差集的操作,比如交集吧,可以把两个人的粉丝列表整一个交集,看看俩人的共同好友是谁?对吧。
把两个大 V 的粉丝都放在两个 set 中,对两个 set 做交集。
#-------操作一个set-------
# 添加元素
sadd mySet 1 # 查看全部元素
smembers mySet # 判断是否包含某个值
sismember mySet 3 # 删除某个/些元素
srem mySet 1
srem mySet 2 4 # 查看元素个数
scard mySet # 随机删除一个元素
spop mySet #-------操作多个set-------
# 将一个set的元素移动到另外一个set
smove yourSet mySet 2 # 求两set的交集
sinter yourSet mySet # 求两set的并集
sunion yourSet mySet # 求在yourSet中而不在mySet中的元素
sdiff yourSet mySet
sorted set
sorted set 是排序的 set,去重但可以排序,写进去的时候给一个分数,自动根据分数排序。
zadd board 85 zhangsan
zadd board 72 lisi
zadd board 96 wangwu
zadd board 63 zhaoliu # 获取排名前三的用户(默认是升序,所以需要 rev 改为降序)
zrevrange board 0 3 # 获取某用户的排名
zrank board zhaoliu
最新文章
- Bash 的 no-fork 优化
- RunLoop相关知识的总结
- linux 下C语言学习路线
- SQL Server的高级知识
- 创建与合并分支-git入门教程
- div+css定位position详解
- 选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中
- 图像处理函数详解——im2bw
- 网络请求 post 的接受请求头的代理方法
- 基于cx_freeze编译PyQt4程序(numpy &; scipy)
- PHP 网页爬虫
- [Swift]LeetCode252.会议室 $ Meeting Rooms
- 浅谈Vue之双向绑定
- react-native android/ios 根据配置文件编译时自动修改版本号
- MSDN Windows各版本哈希值
- JAVA面试精选【Java算法与编程二】
- linux 上配置tomcat、mysql 开机启动
- thinkphp3.2 导航高亮显示
- Summary: Stack Overflow Error
- Python入门之用Python统计代码行
热门文章
- USACO Grass Planting
- LG4035/BZOJ1013 「JSOI2008」球形空间产生器 高斯消元
- Python进阶-Ⅷ 匿名函数 lambda
- Signal ()函数用法和总结
- [LeetCode] 410. Split Array Largest Sum 分割数组的最大值
- BS项目启动任意EXE文件或者CS项目
- GC分析工具使用-gceacy分析堆栈
- 利用Jenkins打包并远程部署NodeJS应用
- 文件上传之靶场upload-labs (11-20)
- oracle数据库安装过程中的疑惑—该记录是本人以前写在微博上的文章