Redis学习
1.简介
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
Redis的优势:
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。#
2.Redis配置
详情见:https://www.runoob.com/redis/redis-conf.html
3.Redis数据类型
String类型
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB
Redis中只能存字符串,数字也是字符串的形式保存的
127.0.0.1:6379> set ceshistring "hello world"
OK
127.0.0.1:6379> get ceshistring
hello world
1.将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
127.0.0.1:6379> getset ceshi "helloday"
helloworld
2.获取所有(一个或多个)给定 key 的值。
127.0.0.1:6379> mget ceshi ceshi1
helloday
123
3.将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
127.0.0.1:6379> setex ceshi 3 "helloworld"
OK
4.只有在 key 不存在时设置 key 的值。
127.0.0.1:6379> setnx ceshi "123"
1
127.0.0.1:6379> get ceshi
123
127.0.0.1:6379> setnx ceshi "000"
0
127.0.0.1:6379> get ceshi
123
127.0.0.1:6379>
5.返回 key 所储存的字符串值的长度。
127.0.0.1:6379> strlen ceshi
3
6.同时设置一个或多个 key-value 对。
127.0.0.1:6379> mset ceshi1 "ceshi1" ceshi2 "ceshi2"
OK
127.0.0.1:6379> get ceshi1
ceshi1
127.0.0.1:6379> get ceshi2
ceshi2
127.0.0.1:6379>
7.同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
127.0.0.1:6379> msetnx ceshi1 "ceshi" ceshi3 "ceshi3"
0
127.0.0.1:6379> get ceshi1
ceshi1
127.0.0.1:6379> get ceshi3
发现key为ceshi3没有值,遵循了redis的原子性,要么成功要么失败
8.和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
127.0.0.1:6379> psetex ceshi0 3000 "hello world"
OK
9.将 key 中储存的数字值增一。
127.0.0.1:6379> get ceshi
10
127.0.0.1:6379> incr ceshi
11
127.0.0.1:6379> get ceshi
11
10.将 key 中储存的数字值减一。
127.0.0.1:6379> decr ceshi
10
11.key 所储存的值减去给定的减量值(decrement) 当key不存在,会直接默认为0进行删除
127.0.0.1:6379> get ceshi0
ceshi0为空
127.0.0.1:6379> decrby ceshi0 10
-10
127.0.0.1:6379> get ceshi0
-10
12.将 key 所储存的值加上给定的浮点增量值
127.0.0.1:6379> get ceshi0
-10
127.0.0.1:6379> incrby ceshi0 20
10
127.0.0.1:6379> get ceshi0
10
13.如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。
127.0.0.1:6379> get ceshi
10
127.0.0.1:6379> append ceshi "你好中国"
10
127.0.0.1:6379> get ceshi
10你好中国
hash(哈希)类型
每个 hash 可以存储 232 -1 键值对(40多亿)
1.查看哈希表 key 中,指定的字段是否存在。
127.0.0.1:6379> hexists ceshi key1
1
2.获取存储在哈希表中指定字段的值。
127.0.0.1:6379> hget ceshi key1
value1
3.获取在哈希表中指定 key 的所有字段和值
127.0.0.1:6379> hgetall ceshi
key1
value1
key2
value2
4.为哈希表 key 中的指定字段的整数值加上增量 increment 。
127.0.0.1:6379> hincrby ceshi key4 100
102
5.获取哈希表中字段的数量
127.0.0.1:6379> hlen ceshi
5
6.同时将多个 field-value (域-值)对设置到哈希表 key 中。
127.0.0.1:6379> hmset ceshi key1 "value1" key2 "value2" key3 "value3"
OK
127.0.0.1:6379> hgetall ceshi
key1
value1
key2
value2
key3
value3
7.获取哈希表中所有值。
127.0.0.1:6379> hvals ceshi
value1
value2
value3
8.迭代哈希表中的键值对。
HSCAN key cursor [MATCH pattern] [COUNT count]
--cursor - 游标。
--pattern - 匹配的模式。
--count - 指定从数据集里返回多少元素,默认值为 10 。
注:后面的match是匹配的Redis中的键
127.0.0.1:6379> hscan ceshi 0 match "key1*"
0
key1
value1
List列表 (可以重复)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
1.移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
127.0.0.1:6379> blpop ceshi 10
ceshi
value1
2.移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
BRPOP key1 [key2 ] timeout
3.通过索引获取列表中的元素
LINDEX key index
4.在列表的元素前或者后插入元素
LINSERT mylist BEFORE "World" "There"
5.获取列表长度
LLEN key
6.移出并获取列表的第一个元素
LPOP key
Set集合和有序集合
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
集合对象的编码可以是 intset 或者 hashtable。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
1.向集合添加一个或多个成员
127.0.0.1:6379> sadd ceshi value1 value2 value3
3
2.获取集合的成员数
127.0.0.1:6379> scard ceshi
3
3.返回第一个集合与其他集合之间的差异
127.0.0.1:6379> smembers ceshi
value1
value3
value2
127.0.0.1:6379> smembers ceshi1
value1
value2
127.0.0.1:6379> sdiff ceshi ceshi1
value3
4.返回给定所有集合的差集并存储在 destination 中
127.0.0.1:6379> sdiffstore ceshidiff ceshi ceshi1
1
127.0.0.1:6379> smembers ceshidiff
value3
127.0.0.1:6379>
5.返回给定所有集合的交集
127.0.0.1:6379> sinter ceshi ceshi1
value1
value2
6.返回给定所有集合的交集并存储在 destination 中
127.0.0.1:6379> sinterstore insdiff ceshi ceshi1
2
127.0.0.1:6379> smembers insdiff
value1
value2
7.判断 member 元素是否是集合 key 的成员
127.0.0.1:6379> sismember ceshi value1
1 //存在
127.0.0.1:6379> sismember ceshi value
0 //不存在
8.返回集合中的所有成员
127.0.0.1:6379> smembers ceshi
value1
value3
value2
9.将 member 元素从 source 集合移动到 destination 集合
127.0.0.1:6379> smembers ceshi
value3
value2
127.0.0.1:6379> smembers outceshi
value1
10.移除并返回集合中的一个随机元素
127.0.0.1:6379> spop ceshi
value1
127.0.0.1:6379> smembers ceshi
value3
value2
11.返回集合中一个或多个随机数、
SRANDMEMBER key [count]
127.0.0.1:6379> srandmember ceshi 2 从集合名称为ceshi中返回随机返回两个值
value
value3
12.移除集合中一个或多个成员
127.0.0.1:6379> srem ceshi value
1
13.返回所有给定集合的并集
127.0.0.1:6379> sadd unionceshi unionvalue
1
127.0.0.1:6379> smembers unionceshi
unionvalue
127.0.0.1:6379> sunion ceshi unionceshi
value1
unionvalue
value2
value3
14.所有给定集合的并集存储在 重命名的 集合中
127.0.0.1:6379> sunionstore unionset ceshi unionceshi
4
127.0.0.1:6379> smembers unionset
value1
unionvalue
value2
value3
15.迭代集合中的元素
127.0.0.1:6379> sscan unionset 0 match "value*"
0
value1
value2
value3
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
HyperLogLog
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
redis 发布与订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
Redis 客户端可以订阅任意数量的频道。
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
1.搭建订阅者客户端
再客户端中进行注册
127.0.0.1:6379> subscribe testchat
subscribe
testchat
1
2.重新打开一个Redis命令行,创建发送者客户端
127.0.0.1:6379> publish testchat "发布一个消息"
1
3.这时订阅者客户端收到发布者发布的消息
127.0.0.1:6379> subscribe testchat
subscribe
testchat
1
message
testchat
发布一个消息
事务
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务。
- 命令入队。
- 执行事务。
示例:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a 111
QUEUED
127.0.0.1:6379> set b 222
QUEUED
127.0.0.1:6379> set c 333
QUEUED
127.0.0.1:6379> exec
OK
OK
OK
注:单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务不是原子性的
RedisGEO
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。
Redis GEO 操作方法有:
- geoadd:添加地理位置的坐标。
- geopos:获取地理位置的坐标。
- geodist:计算两个位置之间的距离。
- georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
- georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
- geohash:返回一个或多个位置对象的 geohash 值。
geoadd 用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。
GEOADD key longitude latitude member [longitude latitude member ...]
geopos 用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。
GEOPOS key member [member ...]
geodist 用于返回两个给定位置之间的距离。
geodist 语法格式如下:
GEODIST key member1 member2 [m|km|ft|mi]
member1 member2 为两个地理位置。
最后一个距离单位参数说明:
- m :米,默认单位。
- km :千米。
- mi :英里。
- ft :英尺。
georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
georadiusbymember 和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 georadiusbymember 的中心点是由给定的位置元素决定的, 而不是使用经度和纬度来决定中心点。
georadius 与 georadiusbymember 语法格式如下:
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
参数说明:
-
- m :米,默认单位。
- km :千米。
- mi :英里。
- ft :英尺。
- WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
- WITHCOORD: 将位置元素的经度和纬度也一并返回。
- WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
- COUNT 限定返回的记录数。
- ASC: 查找结果根据距离从近到远排序。
- DESC: 查找结果根据从远到近排序。
Redis GEO 使用 geohash 来保存地理位置的坐标。
-