Skip to content

Commit

Permalink
docs(redis): add redis-data-types.md
Browse files Browse the repository at this point in the history
  • Loading branch information
yanglbme committed Nov 16, 2018
1 parent f4d58be commit f5ab66f
Show file tree
Hide file tree
Showing 3 changed files with 124 additions and 2 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
### [缓存](/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 都有哪些数据类型?分别在哪些场景下使用比较合适?
- [Redis 都有哪些数据类型?分别在哪些场景下使用比较合适?](/docs/high-concurrency/redis-data-types.md)
- Redis 的过期策略都有哪些?手写一下 LRU 代码实现?
- 如何保证 Redis 高并发、高可用、持久化?Redis的主从复制原理能介绍一下么?Redis 的哨兵原理能介绍一下么?
- Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的?
Expand Down
122 changes: 122 additions & 0 deletions docs/high-concurrency/redis-data-types.md
Original file line number Diff line number Diff line change
@@ -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
```
2 changes: 1 addition & 1 deletion docs/high-concurrency/redis-single-thread-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ redis 相比 memcached 来说,拥有更多的数据结构,能支持更丰富
由于 redis 只使用单核,而 memcached 可以使用多核,所以平均每一个核上 redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中,memcached 性能要高于 redis,虽然 redis 最近也在存储大数据的性能上进行优化,但是比起 memcached,还是稍有逊色。

### redis 的线程模型
redis 内部使用文件事件处理器 `file event handler`这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。
redis 内部使用文件事件处理器 `file event handler`,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。

文件事件处理器的结构包含 4 个部分:
- 多个 socket
Expand Down

0 comments on commit f5ab66f

Please sign in to comment.