docs(redis): add redis-data-types.md

This commit is contained in:
yanglbme 2018-11-16 09:30:22 +08:00
parent f4d58be188
commit f5ab66fd76
3 changed files with 124 additions and 2 deletions

View File

@ -60,7 +60,7 @@
### [缓存](/docs/high-concurrency/why-cache.md) ### [缓存](/docs/high-concurrency/why-cache.md)
- [在项目中缓存是如何使用的?缓存如果使用不当会造成什么后果?](/docs/high-concurrency/why-cache.md) - [在项目中缓存是如何使用的?缓存如果使用不当会造成什么后果?](/docs/high-concurrency/why-cache.md)
- [Redis 和 Memcached 有什么区别Redis 的线程模型是什么?为什么单线程的 Redis 比多线程的 Memcached 效率要高得多?](/docs/high-concurrency/redis-single-thread-model.md) - [Redis 和 Memcached 有什么区别Redis 的线程模型是什么?为什么单线程的 Redis 比多线程的 Memcached 效率要高得多?](/docs/high-concurrency/redis-single-thread-model.md)
- Redis 都有哪些数据类型?分别在哪些场景下使用比较合适? - [Redis 都有哪些数据类型?分别在哪些场景下使用比较合适?](/docs/high-concurrency/redis-data-types.md)
- Redis 的过期策略都有哪些?手写一下 LRU 代码实现? - Redis 的过期策略都有哪些?手写一下 LRU 代码实现?
- 如何保证 Redis 高并发、高可用、持久化Redis的主从复制原理能介绍一下么Redis 的哨兵原理能介绍一下么? - 如何保证 Redis 高并发、高可用、持久化Redis的主从复制原理能介绍一下么Redis 的哨兵原理能介绍一下么?
- Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的? - Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的?

View File

@ -0,0 +1,122 @@
## 面试题
redis 都有哪些数据类型?分别在哪些场景下使用比较合适?
## 面试官心理分析
除非是面试官感觉看你简历,是工作 3 年以内的比较初级的同学,可能对技术没有很深入的研究,面试官才会问这类问题。否则,在宝贵的面试时间里,面试官实在不想多问。
其实问这个问题,主要有两个原因:
- 看看你到底有没有全面的了解 redis 有哪些功能,一般怎么来用,啥场景用什么,就怕你别就会最简单的 kv 操作
- 看看你在实际项目里都怎么玩儿过 redis
要是你回答的不好,没说出几种数据类型,也没说什么场景,你完了,面试官对你印象肯定不好,觉得你平时就是做个简单的 set 和 get。
## 面试题剖析
redis 主要有以下几种数据类型:
- string
- hash
- list
- set
- sorted set
### string
这是最简单的类型,就是普通的 set 和 get做简单的 KV 缓存。
```bash
set college szu
```
### hash
这个是类似 map 的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是**这个对象没嵌套其他的对象**)给缓存在 redis 里,然后每次读写缓存的时候,可以就操作 hash 里的**某个字段**。
```bash
hset person name bingo
hset person age 20
hset person id 1
hget person name
```
```json
person = {
"name": "bingo",
"age": 20,
"id": 1
}
```
### list
list 是有序列表,这个可以玩儿出很多花样。
比如可以通过 list 存储一些列表型的数据结构,类似粉丝列表了、文章的评论列表了之类的东西。
比如可以通过 lrange 命令,读取某个闭区间内的元素,可以基于 list 实现分页查询,这个是很棒的一个功能,基于 redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能高,就一页一页走。
```bash
# 0开始位置-1结束位置结束位置为-1时表示列表的最后一个位置即查看所有。
lrange mylist 0 -1
```
比如可以搞个简单的消息队列,从 list 头怼进去,从 list 尾巴那里弄出来。
```bash
lpush mylist 1
lpush mylist 2
lpush mylist 3 4 5
# 1
rpop mylist
```
### set
list 是无序集合,自动去重。
直接基于 set 将系统里需要去重的数据扔进去,自动就给去重了,如果你需要对一些数据进行快速的全局去重,你当然也可以基于 jvm 内存里的 HashSet 进行去重,但是如果你的某个系统部署在多台机器上呢?得基于 redis 进行全局的 set 去重。
可以基于 set 玩儿交集、并集、差集的操作,比如交集吧,可以把两个人的粉丝列表整一个交集,看看俩人的共同好友是谁?对吧。
把两个大v的粉丝都放在两个 set 中,对两个 set 做交集。
```bash
#-------操作一个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去重但可以排序写进去的时候给一个分数自动根据分数排序。
```bash
zadd board 85 zhangsan
zadd board 72 lisi
zadd board 96 wangwu
zadd board 63 zhaoliu
# 获取排名前三的用户(默认是升序,所以需要 rev 改为降序)
zrevrange board 0 3
# 获取某用户的排名
zrank board zhaoliu
```

View File

@ -20,7 +20,7 @@ redis 相比 memcached 来说,拥有更多的数据结构,能支持更丰富
由于 redis 只使用单核,而 memcached 可以使用多核,所以平均每一个核上 redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中memcached 性能要高于 redis虽然 redis 最近也在存储大数据的性能上进行优化,但是比起 memcached还是稍有逊色。 由于 redis 只使用单核,而 memcached 可以使用多核,所以平均每一个核上 redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中memcached 性能要高于 redis虽然 redis 最近也在存储大数据的性能上进行优化,但是比起 memcached还是稍有逊色。
### redis 的线程模型 ### redis 的线程模型
redis 内部使用文件事件处理器 `file event handler`这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket根据 socket 上的事件来选择对应的事件处理器进行处理。 redis 内部使用文件事件处理器 `file event handler`,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket根据 socket 上的事件来选择对应的事件处理器进行处理。
文件事件处理器的结构包含 4 个部分: 文件事件处理器的结构包含 4 个部分:
- 多个 socket - 多个 socket