
1、为什么Redis这么快?
100000 + QPS(Query pre Second 美秒查询次数)
1、完全基于内存,绝大部分请求是纯粹的内存操作,执行效率高;
2、数据结构简单,对数据操作也简单;
3、采用单线程,单线程也能处理高并发请求,想多核也可启动多实例;
4、使用多路I/O复用模型,非阻塞IO。
2、Redis数据类型有哪些?
常用数据类型:
- string: 字符串
- hash: 散列
- list: 列表
- set: 集合
- sorted set: 有序集合
string 字符串
string 是 Redis 最基本的数据类型,存储简单的key-value类型,值最大能存储 512MB,是二进制安全的,可以包含任何数据,比如jpg图片、序列化的对象、数字等。
主要用到的命令有:
| 命令 | 格式 | 用例 | 描述 |
|---|---|---|---|
| SET | SET key value | Blog:0>SET name Tom “OK” | 将键 key 存储值为 value |
| GET | GET key | Blog:0>GET name “Tom” | 获取键 key 的值 |
| GETSET | GETSET key value | Blog:0>GETSET name Jack “Tom” Blog:0>GET name “Jack” | 将给定 key 的值设为 value ,并返回 key 的旧值(old value) |
| INCR | INCR key | Blog:0>SET num 1 “OK” Blog:0>INCR num “2” | 将键 key 存储的值加上 1 |
| DECR | DECR key | Blog:0>DECR num “1” | 将键 key 存储的值减去 1 |
| INCRBY | INCRBY key n | Blog:0>INCRBY num 2 “3” | 将键 key 存储的值加上整数 n |
| DECRBY | DECRBY key n | Blog:0>DECRBY num 2 “1” | 将键 key 存储的值减去整数 n |
| INCRBYFLOAT | INCRBYFLOAT key n | Blog:0>INCRBYFLOAT num 0.5 Blog:0>INCRBYFLOAT num -0.5 “1” | 将键 key 存储的值加上(负数减去)浮点数 n |
| SETNX | SETNX key value | Blog:0>SETNX weight 2 “1” Blog:0>SETNX weight 3 “0” | 用于给指定的 key 设置 value,如果 key已经存在则返回0,设置成功返回1。nx代表:not exist |
| SETEX | SETEX key T value | Blog:0>SETEX height 10 180 Blog:0>GET height “180” Blog:0>GET height null | 用于给指定的 key 设置 value,并且需要指定该 key 的有效时间, T 秒后则返回为 null |
| SETRANGE | SETRANGE key n value | Blog:0>GET name “TomDo” Blog:0>SETRANGE name 3 Ge “5” Blog:0>GET name “TomGe” | 给指定的 key 的值从指定位置(下标从0开始)重新覆盖内容 |
| GETRANGE | GETRANGE key n m | Blog:0>GET name “TomGe” Blog:0>GETRANGE name 1 3 “omG” | 从下标 n 到 m 获取指定 key 的值的内容 |
| MSET | MSET key1 value1 key2 value2 …… | Blog:0>MSET name Tom age 25 “OK” | 批量设置值 |
| MGET | MGET key1 key2 …… | Blog:0>MGET name age 1) “Tom” 2) “25” | 批量获取值 |
| APPEND | APPEND key value | Blog:0>get name “Jack” Blog:0>APPEND name Tom “7” Blog:0>get name “JackTom” | 如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值value的末尾;key 不存在则设置 value。 |
应用场景:
- 常规
key-value缓存; - 计数功能的缓存:微博粉丝数、点赞数等。
hash 散列
Hash是一个string类型的key和<field,value>的映射表,hash特别适合用于存储对象。 Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)。
主要用到的命令有:
| 命令 | 格式 | 用例 | 描述 |
|---|---|---|---|
| HSET | HSET key field value | Blog:0>HSET ec_token 111 nosfhsofhsof “1” | 将哈希表key中的字段field的值设置为value,若key不存在则创建后赋值,若域field已存在则覆盖。 |
| HDEL | HDEL key field | ||
| HEXISTS | HEXISTS key field | ||
| HGET | HGETkey field | Blog:0>HGET ec_token 111 “nosfhsofhsof” | 从获 key 中取 field 的值 |
| HGETALL | HGET key | Blog:0>HGETALL ec_token 1) “111” 2) “nosfhsofhsof” 3) “222” 4) “vgfndobndb” | 获取key下的所有<field,value> 值 |
| HINCRBY | HINCRBY key field n | Blog:0>HSET token a 1 “1” Blog:0>HINCRBY token a 2 “3” | 哈希表key中的指定字段field的整数值加上增量 n |
| HINCRBYFLOAT | HINCRBYFLOAT key field n | Blog:0>HSET token b 0.5 “1” Blog:0>HINCRBYFLOAT token b 1.6 “2.1” | 哈希表key中的指定字段field的浮点数值加上增量 n |
| HKEYS | HKEYS key | Blog:0>HKEYS token 1) “a” 2) “b” | 获取哈希表中所有的字段 |
| HVALS | HVALS key | Blog:0>HVALS token 1) “3” 2) “2.1” | 获取哈希表中所有字段的值 |
| HLEN | HLEN key | Blog:0>HLEN token “2” | 获取哈希表中所有字段的数量 |
| HMGET | HMGET key field1 [field2] | Blog:0>HMGET token a b 1) “3” 2) “2.1” | 批量获取哈希表中field字段的值 |
| HMSET | HMGET key field1 value1 [field2] [value2] | Blog:0>HMSET token c 4 d 6 “OK” | 批量设置哈希表中field字段的值 |
| HSETNX | HSETNX key field value | Blog:0>HSETNX token e 7 “1” Blog:0>HSETNX token a 7 “0” | 字段 field 不存在时,设置哈希表字段的值 |
比如可以用Hash数据结构来存储
应用场景:
- 用户信息,商品信息;
- token,在做单点登录的时候,就是用这种数据结构存储用户信息,以cookieId作为
field,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。
list 列表
list就是链表,Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表,最新消息排行等功能都可以用Redis的list结构来实现。
Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。
使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户体验好。
主要用到的命令有:
| 命令 | 格式 | 用例 | 描述 |
|---|---|---|---|
| LPUSH | 向列表中添加元素 | ||
| RPUSH | |||
| LPOP | |||
| RPOP | |||
| LRANGE |
set 集合
主要用到的命令有:
| 命令 | 格式 | 用例 | 描述 |
|---|---|---|---|
sorted set 有序集合
主要用到的命令有:
| 命令 | 格式 | 用例 | 描述 |
|---|---|---|---|
不常用数据类型:
- HyperLogLog:基数统计
关注微信公众号:【皮卡战记】


