From f5ab66fd7636e0fc59f922a9a1d5e80e68022ba8 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Fri, 16 Nov 2018 09:30:22 +0800 Subject: [PATCH] docs(redis): add redis-data-types.md --- README.md | 2 +- docs/high-concurrency/redis-data-types.md | 122 ++++++++++++++++++ .../redis-single-thread-model.md | 2 +- 3 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 docs/high-concurrency/redis-data-types.md diff --git a/README.md b/README.md index d150aa4..4c93fac 100644 --- a/README.md +++ b/README.md @@ -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 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的? diff --git a/docs/high-concurrency/redis-data-types.md b/docs/high-concurrency/redis-data-types.md new file mode 100644 index 0000000..1bfbf75 --- /dev/null +++ b/docs/high-concurrency/redis-data-types.md @@ -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 +``` \ No newline at end of file diff --git a/docs/high-concurrency/redis-single-thread-model.md b/docs/high-concurrency/redis-single-thread-model.md index 64b851d..7e29a0b 100644 --- a/docs/high-concurrency/redis-single-thread-model.md +++ b/docs/high-concurrency/redis-single-thread-model.md @@ -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