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:基数统计
关注微信公众号:【皮卡战记】
