Redis – Remote Dictionary Server : 远程字典服务.
Redis 底层是通过 C 语音实现的.为了达到高效的的目的,通过很多巧妙的bit位设计,定义很多数据结构,比如有 Hashtable ,HashSet等.
Redis 安装
Redis 安装,如果只是安装给Mac电脑使用的话,直接取官网下载官网下载,下载解压之后就可以使用了.
进入Redis目录,进入/src目录
1 2 3 4 5 6
| # 启动Redis服务 redis-service
# 启动Redis客户端 redis-cli
|
Linux环境使用
我安装的是centos 7 Linux 环境.
安装步骤
1 2 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
1 2 3 4 5 6 7 8 9
| # 启动Redis服务 redis-service
# 启动Redis客户端 redis-cli
# 检查是否启动 ps -ef | grep redis
|
Redis 常用数据结构
字符串String数据结构
Redis 存储 String类型的数据.
key - value 存储字符串
1 2 3 4
| 普通存储 SET key value
GET key
|
1 2 3 4
| 批量存储 MSET key1 value1 [key2 value2]
MGET key1 [key2]
|
1 2 3 4 5
| 设置过期时间 EXPIRE key seconds
过期时间设置为10 SET flagname true ex 10 nx //防止程序意外终止导致死锁
|
使用场景:
分布式锁
1 2 3 4 5
| 存入一个不存在的值 如果返回1 说明不存在, 返回0说明已存在 SETNX key
删除 DEL key
|
使用场景:
使用Redis可以实现分布式锁功能,如果获取不到锁,要一直尝试获取锁.
自增id/自加
1 2 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;
常用操作
1 2 3 4 5 6 7 8
| 存一组数据 HSET key field value
存一组hashMap中不存在的数据 HSETNX key field value
批量存储 HMSET key field value [field value ...]
|
1 2 3 4 5 6 7 8 9 10 11
| 获取redis中key对用的HashMap中 filed对应的value HGET key field
批量获取 HMGET key field [field ...]
获取key对应的HashMap所有的数据 HGETALL key
批量删除 HDEL key field [field ...]
|
1 2 3 4 5
| key对应的HashMap 中数据数量 HLEN key
将key对应的HashMap 中的field字段对应的值 自增 increment HINCRBY key field increment
|
使用场景:
列表List数据结构
Redis存储List数据结构,可以理解为Values 是很多List集合;
常用操作
1 2 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集合,不会出现重复的数据;
常用操作
1 2 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集合操作(交集 ,并集 ,差集 )
首先复习下 高中集合操作知识
1 2 3 4 5
| AB交集 = A ∩ B
AB并集 = A ∪ B
ABC差集 = A - ( B ∪ C )
|
1 2 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集合,不会出现重复的数据且有序;
1 2 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]
|
集合操作
1 2 3 4 5
| 并集 ZUNIONSTORE destkey numkeys key [key ...]
交集 ZINTERSTORE destkey numkeys key [key …]
|
使用场景: 有排序要求的场景
其他
命令
不推荐使用KEYS ,推荐使用SCAN
1 2 3 4 5 6 7 8 9 10 11
| 获取所有key keys *
带规则 keys a*
scan cursor [MATCH pattern] [COUNT count]
cursor 游标 count 是每次大概输出的数量
|
QA
Redis服务与客户端的网络已经键值对读写是由一个线程来完成的,但Redis的持久化,集群数据同步等是异步线程负责的.
Redis快,是因为Redis的数据操作都是基于内存操作的.
我们知道Redis是基于内存操作的,性能瓶颈一部分在I/O, Redis采用I/O多路复的策略,将客户端连接信息和事件添加到队列,当一个操作完成了,直接获取到连接信息复用上一个I/O实例.