- 学习总结
- 1、介绍Redis
- 2、Redis中的key
- 3、常用数据类型及场景
- 4、Transactions(事务)
- 5、Pub/Sub
- 6、Lua scripting
- 7、Keys with a limited time-to-live
- 8、LRU eviction of keys
- 9、Automatic failover
签到19!
学习总结
定定住天涯,依依向物华。 寒梅最堪恨,常作去年花。
1、介绍Redis
-
概念
Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库、缓存和消息代理。
-
数据类型
它支持诸如字符串、散列、列表、集、带范围查询的排序集、位图、hyperloglogs、带半径查询和流的地理空间索引等数据结构。
-
特性
Redis具有内置的复制、Lua脚本、LRU清除、事务和不同级别的磁盘持久性,并通过Redis Sentinel和带有Redis集群的自动分区提供高可用性(自动故障切换)。
-
原子操作
包括附加到一个字符串、在散列中增加值、将元素推入列表、计算集的交,并,差、得到排序集中排名最高的成员。
2、Redis中的key
Redis的key是二进制安全的,这意味着您可以使用任何二进制序列作为key,从“foo”这样的字符串到JPEG文件的内容。空字符串也是一个有效的键。
key使用规则
-
不要太长
-
不要太短
-
使用一定的规则
点或破折号通常用于多字字段
- “object-type:id” (”user:1000” )
- “comment:1234:reply.to” or “comment:123:reply-to”
-
最大运行512M
3、常用数据类型及场景
strings
- 注意
- 内容大小不能大于512MB
-
操作
-
GET
-
SET
如果存在key就失败nail,
-
INCR
当时int时使用,原子增加1,多个客户操作能够保证原子性;类似的有INCRBY增加x, DECR and DECRBY.
-
GETSET
设置为新的值,返回旧的值
-
MSET
批量设置,MGET批量返回
-
exists
查询是否有该key,返回1或者0
-
DEL
-
APPEND
-
expire
设置存活时间,通过ttl查询剩余时间, PERSIST 取消该值的存活时间,设置milliseconds 的单位,需要PEXPIRE和PTTL
-
Lists
有序列表
-
操作
-
rpush
右边添加
-
lpush
-
lrange
获取从左侧开始的列表子集,如0,-1获取所有,0,-2获取从0到倒数第二个数据
-
rpop
从右边弹出一个
-
LTRIM
可以限制链表,如只保留最新的几个,最新新闻、日志或者什么
-
BRPOP
在使用阻塞队列进行生产者消费模型时,可以让消费者去等待一定时间,或者设置为0一直等待,超时返回null
-
-
使用场景
- 记住用户在社交网络上发布的最新更新。
- 流程之间的通信,使用消费者-生产者模式,生产者将项目推入列表,消费者(通常是工作人员)使用这些项目并执行操作。Redis有特殊的列表命令,使这个用例更加可靠和高效。
- 保留最新的新闻、日志
- 阻塞队列,生产者消费模型
-
创建key和销毁key的规则
- 当给key添加一个值得时候,如果没有该key,则先增加一个空值得key,然后添加值;
- 删除一个键的时候,就将该key自动销毁
- del一个key,或者llen一个key,为0的时候,也销毁该key
Hashes
> hmset user:1000 username antirez birthyear 1977 verified 1
OK
> hget user:1000 username
"antirez"
> hget user:1000 birthyear
"1977"
> hgetall user:1000
1) "username"
2) "antirez"
3) "birthyear"
4) "1977"
5) "verified"
6) "1"
-
操作
-
hmset
-
hget
-
hgetall
-
hmget
-
hincrby
> hincrby user:1000 birthyear 10 (integer) 1987 > hincrby user:1000 birthyear 10 (integer) 1997
-
Sets
> sadd myset 1 2 3
(integer) 3
> smembers myset
1. 3
2. 1
3. 2
-
操作
-
sadd
-
smembers
带序号都列出来
-
sismember
判断key中是否存在某个值
-
sinter
两个集合的交集
-
SPOP
从集合中拿出几个,这个对建模很重要
-
sunionstore
给你集合拷贝另一个集合的所有值
-
scard
获取集合中的数量
-
SRANDMEMBER
随机获取数据,不移除
-
Sorted sets
混合的数据结构:set与hash的组合
-
操作
-
zadd
-
zrange
-
zrange hackers 0 -1 withscores
带有分数的列出来,一个值一个score
-
-
zrevrange
-
zrangebyscore
-
zrangebyscore hackers -inf 1950
分数从无穷大到1950的所有值
-
-
zremrangebyscore
zremrangebyscore hackers 1940 1960 分数在这之间的元素个数
-
zrank
> zrank hackers "Anita Borg" (integer) 4 获取排名
-
zrangebylex
字典编排
zrangebylex hackers [B [P 获取首字母在B和P之间的值
-
Bitmaps
HyperLogLogs
4、Transactions(事务)
为了保证事务,单个步骤中一组命令:
-
原则
- 事务中的所有命令都被序列化并按顺序执行。在执行一个Redis事务的过程中,不可能出现另一个客户端发出的请求。这保证了命令作为一个单独的独立操作执行。
- 要么处理所有命令,要么一个也不处理,因此Redis事务也是原子性的。
-
Redis不支持事务回滚
-
命令
-
MULTI
事务开始前的标志,总是返回ok
-
EXEC
执行从MULTL之后的queued的命令
-
DISCARD
退出事务
-
WATCH
监控键的值得修改,提供a check-and-set (CAS) behavior to Redis transactions.
WATCH mykey val = GET mykey val = val + 1 MULTI SET mykey $val EXEC
-
5、Pub/Sub
订阅、取消订阅和发布实现了发布/订阅消息范型,其中(引用Wikipedia)发送方(发布方)没有将其消息发送给特定的接收方(订阅者)。相反,发布的消息被描述成频道,而不知道(如果有的话)订阅者可能是谁。订阅者表示对一个或多个通道感兴趣,只接收感兴趣的消息,而不知道(如果有的话)发布者在哪里。发布者和订阅者之间的这种解耦允许更大的可伸缩性和更动态的网络。
一般这种情况使用中间件处理不需要使用Redis,这里不做介绍;
- SUBSCRIBE
- PUBLISH
6、Lua scripting
EVAL和EVALSHA用于使用从版本2.6.0开始构建到Redis中的Lua解释器来评估脚本。
> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
-
redis命令
-
redis.call()
> eval "return redis.call('set','foo','bar')" 0 OK
-
redis.pcall()
两者的区别是一个失败返回失败,另一个返回异常信息
-
7、Keys with a limited time-to-live
给key设置超时时间,当超时时间到了自动删除。volatile 术语在redis当中跟超时有关。
超时时间清除的情况
-
删除
命令:DEL
-
重写内容
命令: SET, GETSET and all the *STORE commands
-
PERSIST
-
不改变超时时间的行为
这意味着,所有在概念上更改存储在键上的值而不使用新值替换它的操作都不会影响超时。例如,使用INCR增加键值,使用LPUSH将新值推入列表,或者使用HSET更改散列的字段值,这些操作都不会影响超时。
- RENAME
设置超时时间
-
EXPIRE
如果key存在返回1,不存在返回0
-
TTL
查看剩余时间,-1表示没有超时时间
-
应用场景
-
给用户推荐的感兴趣页面
设置最新的推荐页面,时间为60s
Redis过期一个key
-
消极方式
当客户访问的时候进行处理,如果不访问将用于存在系统中,这很不好
-
积极方式
每一秒执行十次
- 从一组具有关联过期的键中测试20个随机键
- 删除所有已过期的密钥
- 如果超过25%的key过期,则重新从步骤1开始
如何在复制链接和AOF文件中处理过期
- 为了在不牺牲一致性的情况下获得正确的行为,当密钥过期时,将在AOF文件中合成DEL操作并获得所有附加的副本节点。
- 然而而独立副本连接到一个主键不会到期(但将等待DEL来自master),他们仍然会把到期的全部状态存在的数据集,所以当一个复制品当选掌握它将能够到期独立的关键,完全充当master。
8、LRU eviction of keys
使用Redis作为LRU最少使用缓存
配置最大使用内存,当达到指定的内存量时,可以在不同的行为(称为策略)之间进行选择。
maxmemory 100mb
# 如果设置为0,没有限制,这是64位系统的默认行为,而32位系统使用3GB的隐式内存限制。
配置策略maxmemory-policy
-
noeviction
没有策略
-
allkeys-lru
最近最少使用的删掉;期望是幂律分布时;
-
volatile-lru
在设置了超时时间的key中执行,最近最少使用的删掉
-
allkeys-random
所有的key中随机删除;如果您有一个循环访问,其中所有的键被连续地扫描,或者当您期望分布是均匀的
-
volatile-random
在设置了超时时间的key中执行,随机的删掉
-
volatile-ttl
在设置了超时时间的key中执行,删掉存活时间最短的key,希望能够通过使用不同的TTL值向
如果没有设置超时时间这个先决条件,那么volatile-lru 、volatile-random、volatile-ttl跟noeviction是一样的
volatile-lru和volatile-random策略在希望使用单个实例进行缓存和拥有一组持久键时非常有用。然而,运行两个Redis实例来解决这样的问题通常是一个更好的主意。
Redis LRU算法不是一个精确的实现(需要大的内存):那么通过抽样解决问题,通过抽样的数量来配置增加精度;
maxmemory-samples 5
The new LFU mode
最新的最少使用清除模型
lfu-log-factor 10
lfu-decay-time 1
9、Automatic failover
Redis Sentinel哨兵为Redis提供高可用性。
Redis Sentinel还提供其他附属任务,如监控、通知和为客户提供配置。
-
Monitoring.
Sentinel constantly checks if your master and replica instances are working as expected.
-
Notification.
Sentinel can notify the system administrator, or other computer programs, via an API, that something is wrong with one of the monitored Redis instances.
-
Automatic failover.
If a master is not working as expected, Sentinel can start a failover process where a replica is promoted to master, the other additional replicas are reconfigured to use the new master, and the applications using the Redis server are informed about the new address to use when connecting.
-
Configuration provider.
Sentinel acts as a source of authority for clients service discovery: clients connect to Sentinels in order to ask for the address of the current Redis master responsible for a given service. If a failover occurs, Sentinels will report the new address.
分布式的哨兵集群
- 当多个哨兵认为某个节点失败,就进行故障检测,降低了误报率;
- 提高了哨兵集群的可靠性
启动哨兵集群需要:
redis-sentinel /path/to/sentinel.conf
redis-server /path/to/sentinel.conf --sentinel
# 都需要配置文件和默认监听端口打开26379
其余的参数根据情况查文档