Redis – Remote Dictionary Server : 远程字典服务.
Redis 底层是通过 C 语音实现的.为了达到高效的的目的,通过很多巧妙的bit位设计,定义很多数据结构,比如有 Hashtable ,HashSet等.
Redis 安装
Redis 安装,如果只是安装给Mac电脑使用的话,直接取官网下载官网下载,下载解压之后就可以使用了.
进入Redis目录,进入/src目录
| 12
 3
 4
 5
 6
 
 | # 启动Redis服务redis-service
 
 # 启动Redis客户端
 redis-cli
 
 
 | 
Linux环境使用
我安装的是centos 7 Linux 环境.
安装步骤
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | # 安装gcc
 yum install gcc
 
 wget http://download.redis.io/releases/redis‐5.0.2.tar.gz
 
 # 解压
 tar xzf redis‐5.0.2.tar.gz
 
 # 进入redis目录
 cd redis‐5.0.2
 
 
 | 
编译,安装redis
使用redis
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | # 启动Redis服务redis-service
 
 # 启动Redis客户端
 redis-cli
 
 # 检查是否启动
 ps -ef | grep redis
 
 
 | 
Redis 常用数据结构
字符串String数据结构
Redis 存储 String类型的数据.

key - value 存储字符串
| 12
 3
 4
 
 | 普通存储SET key value
 
 GET key
 
 | 
| 12
 3
 4
 
 | 批量存储MSET key1 value1 [key2 value2]
 
 MGET key1 [key2]
 
 | 
| 12
 3
 4
 5
 
 | 设置过期时间EXPIRE  key  seconds
 
 过期时间设置为10
 SET flagname true  ex  10  nx     //防止程序意外终止导致死锁
 
 | 
使用场景: 
分布式锁
| 12
 3
 4
 5
 
 | 存入一个不存在的值 如果返回1 说明不存在, 返回0说明已存在SETNX key
 
 删除
 DEL key
 
 | 
使用场景: 
使用Redis可以实现分布式锁功能,如果获取不到锁,要一直尝试获取锁.
自增id/自加
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | 数字key 存储的值自增(每次+1)INCR  key
 
 数字key 存储的值自减(可以是负数)(每次-1)
 DECR  key
 
 数字key 存储的值自增increment (每次+increment)
 INCRBY  key  increment
 
 数字key 存储的值自减decrement(可以是负数)(每次-decrement)
 DECRBY  key  decrement
 
 | 
使用场景: 
- 实现分库分表的自增id. 
- 实现需要订单号自增. 
- 实现记录访问量. 
哈希Hash数据结构
Redis存储Hash数据结构,可以理解为Values 是很多HashMap;

常用操作
| 12
 3
 4
 5
 6
 7
 8
 
 | 存一组数据HSET  key  field  value
 
 存一组hashMap中不存在的数据
 HSETNX  key  field  value
 
 批量存储
 HMSET  key  field  value [field value ...]
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | 获取redis中key对用的HashMap中 filed对应的valueHGET  key  field
 
 批量获取
 HMGET  key  field  [field ...]
 
 获取key对应的HashMap所有的数据
 HGETALL  key
 
 批量删除
 HDEL  key  field  [field ...]
 
 | 
| 12
 3
 4
 5
 
 | key对应的HashMap 中数据数量HLEN  key
 
 将key对应的HashMap 中的field字段对应的值 自增 increment
 HINCRBY  key  field  increment
 
 | 
使用场景: 
列表List数据结构
Redis存储List数据结构,可以理解为Values 是很多List集合;

常用操作
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | 给key 对应的list 从左添加元素
 LPUSH  key  value [value ...]
 
 移除左边头元素
 LPOP  key
 
 给key 对应的list 从右添加元素
 RPUSH  key  value [value ...]
 
 移除右边头元素
 RPOP  key
 
 从左边开始输出 范围start - stop的元素
 LRANGE  key  start  stop
 
 带阻塞功能的LPOP(带超时时间)
 BLPOP  key  [key ...]  timeout
 
 带阻塞功能的RPOP(带超时时间)
 BRPOP  key  [key ...]  timeout
 
 | 
使用场景: 
- 实现Stack , QUEUE , Blocking MQ
Stack (FILO) = LPUSH + LPOP |  RPUSH + RPOP
QUEUE (FIFO) = LPUSH + RPOP |  RPUSH + LPOP
Blocking MQ  = LPUSH + BRPOP | RPUSH + BLPOP 
集合Set数据结构
Redis存储Set数据结构,可以理解为Values 是很多Set集合,不会出现重复的数据;

常用操作
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | 添加元素SADD  key  member  [member ...]
 
 移除元素
 SREM  key  member  [member ...]
 
 获取key 对应set的所有元素
 SMEMBERS  key
 
 获取key 对应set的元素个数
 SCARD  key
 
 判断member 是否在 key 对应的set集合中
 SISMEMBER  key  member
 
 从key对应的set集合中获取 count 个元素(不执行删除操作)
 SRANDMEMBER  key  [count]
 
 从key对应的set集合中获取 count 个元素(执行删除操作)
 SPOP  key  [count]
 
 | 
Set集合操作(交集 ,并集  ,差集 )
首先复习下 高中集合操作知识
| 12
 3
 4
 5
 
 | AB交集 = A ∩ B
 AB并集 = A ∪ B
 
 ABC差集 = A - ( B ∪ C )
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | 将多个key 对应的 Redis Set集合取交集 SINTER  key  [key ...]
 
 将多个key 对应的 Redis Set集合取交集 并存储到新的 destination Set 集合中
 SINTERSTORE  destination  key  [key ..]
 
 
 将多个key 对应的 Redis Set集合取并集
 SUNION  key  [key ..]
 
 多个key 对应的 Redis Set集合取并集 并存储到新的 destination Set 集合中
 SUNIONSTORE  destination  key  [key ...]
 
 将多个key 对应的 Redis Set集合取差集
 SDIFF  key  [key ...]
 
 多个key 对应的 Redis Set集合取差集 并存储到新的 destination Set 集合中
 SDIFFSTORE  destination  key  [key ...]
 
 | 
使用场景: 
- 微信抽奖功能(要求不重复) 
- 年会抽奖活动(不重复,可删除) 
- 微信点赞/是否点赞,标签 
- 微博共同关注,QQ共同好友 
- 电商平台商品分类功能(集合操作) 
有序集合Zset数据结构
Redis存储ZSet数据结构,可以理解为Values 是很多Set集合,不会出现重复的数据且有序; 

| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | 将排序规则为score 的元素 添加到 ZSet 集合中
 ZADD key score member [[score member]…]
 
 移除key对应的ZSet 中的member元素
 ZREM key member [member …]
 
 获取Score
 ZSCORE key member
 
 给Key对应的ZSet 中 member 成员的 score + increment( 操作完之后 会重新排序)
 ZINCRBY key increment member
 
 获取Key 对应ZSet集合中元素的数量
 ZCARD key
 
 正序 获取key对应的ZSet 中范围为start - stop 中 member ( 如果带上WITHSCORES] 可以输出 score )
 ZRANGE key start stop [WITHSCORES]
 
 倒序 获取
 ZREVRANGE key start stop [WITHSCORES]
 
 | 
集合操作
| 12
 3
 4
 5
 
 | 并集ZUNIONSTORE destkey numkeys key [key ...]
 
 交集
 ZINTERSTORE destkey numkeys key [key …]
 
 | 
使用场景:  有排序要求的场景
其他
命令
不推荐使用KEYS ,推荐使用SCAN
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | 获取所有keykeys *
 
 带规则
 keys a*
 
 
 scan cursor [MATCH pattern] [COUNT count]
 
 cursor  游标
 count   是每次大概输出的数量
 
 | 
QA
Redis服务与客户端的网络已经键值对读写是由一个线程来完成的,但Redis的持久化,集群数据同步等是异步线程负责的.
Redis快,是因为Redis的数据操作都是基于内存操作的.
我们知道Redis是基于内存操作的,性能瓶颈一部分在I/O, Redis采用I/O多路复的策略,将客户端连接信息和事件添加到队列,当一个操作完成了,直接获取到连接信息复用上一个I/O实例.