redis
2018-07-23 09:49:07 159 举报
AI智能生成
redis知识点
作者其他创作
大纲/内容
持久化
快照:snapshotting
save 900 1 900秒内发生一次
save 300 10 300秒内发生10次
save 60 10000 60秒内发生10000
dbfilename dump.rdb 快照名
dir ./ 快照路径
save 300 10 300秒内发生10次
save 60 10000 60秒内发生10000
dbfilename dump.rdb 快照名
dir ./ 快照路径
手动快照
登陆状态下:bgsave
未登录状态下:./redis-cli bgsave
save
追加:appendonly
appendonly yes 开启
appendfilename "appendonly.aof" 文件名
# appendfsync always 每次操作都存储
appendfsync everysec 每秒存储一次
# appendfsync no
appendfilename "appendonly.aof" 文件名
# appendfsync always 每次操作都存储
appendfsync everysec 每秒存储一次
# appendfsync no
主从数据
http://doc.redisfans.com/topic/replication.html
在从服务器中配置
slaveof 192.168.1.1 6379
masterauth <password>
slaveof 192.168.1.1 6379
masterauth <password>
配置
配置主服务器地址:slaveof 192.168.1.1 6379
从服务器默认只读,设置从服务器只读:slave-read-only yes
如果主服务器设置了密码,那么需要配置密码来访问:masterauth <password>
从服务器至少达到N个才让从服务器执行写操作:min-slaves-to-write N
从服务器延迟低于M秒才向从服务器发送写命令:min-slaves-max-lag M
命令
设置主服务器地址:SLAVEOF 192.168.1.1 10086
设置只读: CONFIG SET
设置主服务器访问密码:config set masterauth <password>
安全
redis默认没有密码,可以通过requirepass设置密码
设置redis.conf文件中的requirepass pass 设置密码
获取密码:CONFIG get requirepass
设置密码:CONFIG set requirepass pass
redis设置密码时
redis可以连接,但是不能操作需要输入密码
AUTH password
连接时输入密码
./redis-cli 127.0.0.1 -p 6379 -a pass
hash
基本命令
赋值/获取
hset
hset name cai caijian
hget
hget name cai
hmset
hmset name cai caijian li lisi
hmget
hmget name cai li
hkeys
获取hash里面所有的key
hkeys name
hgetall
获取hash里面所有的key,value
hgetall name
hvals
获取hash里面的所有value
hsetnx
设置hash,不存在则设置,返回1,存在则不操作,返回0
hexists
判断key是否存在
hdel
hincrby
hlen
发布/订阅
publish
发布
PUBLISH channel message
subscribe
订阅
SUBSCRIBE channel [channel ...]
unsubscribe
取消订阅
pubsub
活跃频道指的是那些至少有一个订阅者的频道
psubscribe
订阅一个或多个符合给定模式的频道,支持通配符
SUBSCRIBE channel.*
日志
List
BLPOP key[key ...]
删除,并获取第一个元素
BRPOP key[key ...]
删除,并获取最后一个元素
BRPOPLPUSH source destination
弹出一个列表值,将他插入到另一个列表中
LINDEX key index
通过索引获取一个元素
LINSERT key BEFORE|AFTER pivot value
在列表中的另一个元素之前或之后插入元素
LLEN key
获取队列长度
LPOP key
从队列左边出队一个元素
LPUSH key value[value]
从队列的左边入队一个或多个元素
LPUSHX key value
当队列存在时,从队左边入队一个元素
LRANGE key start stop
获取指定的元素
LREM key count value
从列表中删除元素
LSET key index value
根据下标设置队列元素值
LTRIM key start stop
子主题
RPOP key
从队列右边出队一个元素
RPOPLPUSH source destination
删除队列最后一个元素,最加到另一个队列
RPUSH key value[value ...]
从队列右边入队一个元素
RPUSHX key value
从队列右边入队一个元素,仅队列存在时有效
SortedSet
子主题
子主题
子主题
子主题
子主题
子主题
子主题
子主题
子主题
简介
历史发展
高性能键值对数据库
特点
共享内存[专门的内存空间]
持久化
特性
存储结构
字符串(String)
哈希/散列/字典(Hash)
列表(List)
集合(Set)
有序集合(sorted set)
内存存储与持久化
redis数据存储在内存中,速度比硬盘快,在程序退出时可将数据持久化到硬盘中防止丢失
功能丰富
数据库(database)
缓存(cache)
消息中间件(message broker)
简单稳定
语法简单
稳定
官方文档:http://doc.redisfans.com/
KEY
keys
模式匹配
keys n?me
keys n*me
keys n[]me
keys n\?me
exists
判断指定的key是否存在,存在返回 1 不存在返回 0
exists name
del
删除key,返回删除的数量
del name
type
查看key类型
type name
randomkey
返回一个随机key
randomkey
expire
设置key过期时间
expire name 60
ttl
查看key剩余过期时间,.不存在时,返回 -2; key 存在但没有
设置剩余生存时间时,返回 -1;以秒为单位,返回 key 的剩余生存时间
设置剩余生存时间时,返回 -1;以秒为单位,返回 key 的剩余生存时间
ttl name
expireat
以某个时间点为过期时间,-毫秒,expireat 时间戳;
expireat 140090898092890
sort
排序
数字
sort name
sort name desc
字符串
sort name alpha
sort name alpha desc
server
flushall
强制清空所有数据库中的所有key
flushdb
清空当前数据库中的所有 key
CLIENT LIST
所有连接到服务器的客户端信息和统计数据
CLIENT KILL
关闭地址为 ip:port 的客户端
CLIENT KILL 127.0.0.1:43501
PING
向 Redis 服务器发送一个 PING ,如果服务器运作正常的话,会返回一个 PONG
ECHO
打印一个特定的信息 message ,测试时使用
QUIT
请求服务器关闭与当前客户端的连接
string
基本命令
特性
一个key中最大存储512M的数据
查询/赋值
get/set
mget/mset
多个key操作
mset name caijian sex man age 23
mget name sex age
getrange
获取指定下标范围内的字符串
getrange name 3 6
setrange
设置指定下表开始替换字符,有多长替换多长
setrange name 3 jian
setex
相当于set + expire命令的组合
setex name 600 ciajian
incr
将 key 中储存的数字值增 1,如果 key 不存在,那么 key 的值会先被初始化为 0 ,
然后再执行 INCR 操作,字符串类型的值不能表示为数字,那么返回一个错误
然后再执行 INCR 操作,字符串类型的值不能表示为数字,那么返回一个错误
incr nums
incrby
原理同incr,但是可以指定一次增加的数量
incrby nums 10
decr
自减 1
decr nums
decrby
自减 指定数
decrby nums 10
append
追加字符串
append name caijian
strlen
字符串长度
子主题
子主题
子主题
二进制
getbit
获取二进制中offset这个位置的“0,1”状态
get num1 0
setbit
设置二进制中offset这个位置的“0,1”状态
set num1 7 1
bitcount
获取二进制中1的个数
bitcount num1
bitop
二进制位的操作(^ & |),对一个或多个保存二进制位的字符串
key 进行位元操作,并将结果保存到 destkey 上
key 进行位元操作,并将结果保存到 destkey 上
BITOP AND destkey key [key ...]
BITOP OR destkey key [key ...]
BITOP XOR destkey key [key ...]
BITOP NOT destkey key
注意点
你所输入的数字全部用char类型表示, 2 => ascII形式展现【50】,
所以2是字符的“2 2=> '2' => 50 => 0 0 1 1 0 0 1 0
所以2是字符的“2 2=> '2' => 50 => 0 0 1 1 0 0 1 0
子主题
Transaction(事务)
multi
事务开始
exec
事务结束
discard
取消事务,放弃执行事务块内的所有命令
watch
监视key变化,发生变化时会取消事务
unwatch
取消 WATCH 命令对所有 key 的监视
哨兵 sentinel
sentinel用于监视master是否正常在线,如果master挂掉了,sentinel会让slave顶上去
开3个Sentinel,或者说开奇数个,Sentinel的原理就是一直监视着master是否在线,
如果挂掉,sentinel的集群会选举中一个零头的sentinel,然后由领头的sentinel
执行slaveof命令,让slave作为master,然后sentinel集群继续监视着新的master,
老的master还是会一直监控着,如果启动了,那么老的master会作为新master的slave。
如果挂掉,sentinel的集群会选举中一个零头的sentinel,然后由领头的sentinel
执行slaveof命令,让slave作为master,然后sentinel集群继续监视着新的master,
老的master还是会一直监控着,如果启动了,那么老的master会作为新master的slave。
sentinel判断master下线的两种标准
主观下线。 sentinel发现master没有在指定时间返回信息,这种情况被认为
主线下线。 【指定时间:这个时间是我们设置的】
主线下线。 【指定时间:这个时间是我们设置的】
客观下线。 sentinel询问sentinel的集群,看一下其他的sentinel是否也标记
这master是否下线,如果标记sentinel下线的个数达到一个阀值,
sentinel会将master标记为主线下线,这个时候能会选取领头的
sentinel。由领头的sentinel选取master下面的一个slave1去作为
新的master。
这master是否下线,如果标记sentinel下线的个数达到一个阀值,
sentinel会将master标记为主线下线,这个时候能会选取领头的
sentinel。由领头的sentinel选取master下面的一个slave1去作为
新的master。
配置
你要监视的主服务器的ip地址,以及sentinel标记客观下线的阀值
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel认为“主线下线”的一个阀值
sentinel down-after-milliseconds mymaster 3000
故障恢复期间可以同时slave的个数
sentinel parallel-syncs mymaster 1
故障恢复允许的最大时长
sentinel failover-timeout mymaster 180000
默认会有一个实例ID,注释掉每次启动会自动分配sentinel myid
如果redis设置了密码需要配置密码,不支持主从密码不一致:sentinel auth-pass mymaster pass
集群cluster
简介
一个 Redis 集群包含 16384 个哈希槽(hash slot),通过CRC16(key) 计算键 key 属于哪台服务器,redis集群最多有16384台机器
集群中的每个节点都有 1 个至 N 个复制品(replica), 其中一个复制品为主节点(master), 而其余的 N-1 个复制品为从节点(slave),主节点宕机后其他服务器会选举出其中一个slave为新的主节点,否正整个集群将停止运作,因为没有对应的服务器承接相应的哈希槽
Redis 集群不保证数据的强一致性
网络分裂
假设集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六个节点, 其中 A 、B 、C 为主节点, 而 A1 、B1 、C1 分别为三个主节点的从节点, 另外还有一个客户端 Z1 。
假设集群中发生网络分裂, 那么集群可能会分裂为两方, 大多数(majority)的一方包含节点 A 、C 、A1 、B1 和 C1 , 而少数(minority)的一方则包含节点 B 和客户端 Z1 。
在网络分裂期间, 主节点 B 仍然会接受 Z1 发送的写命令:
如果网络分裂出现的时间很短, 那么集群会继续正常运行;
但是, 如果网络分裂出现的时间足够长, 使得大多数一方将从节点 B1 设置为新的主节点, 并使用 B1 来代替原来的主节点 B , 那么 Z1 发送给主节点 B 的写命令将丢失。
注意, 在网络分裂出现期间, 客户端 Z1 可以向主节点 B 发送写命令的最大时间是有限制的, 这一时间限制称为节点超时时间(node timeout), 是 Redis 集群的一个重要的配置选项:
假设集群中发生网络分裂, 那么集群可能会分裂为两方, 大多数(majority)的一方包含节点 A 、C 、A1 、B1 和 C1 , 而少数(minority)的一方则包含节点 B 和客户端 Z1 。
在网络分裂期间, 主节点 B 仍然会接受 Z1 发送的写命令:
如果网络分裂出现的时间很短, 那么集群会继续正常运行;
但是, 如果网络分裂出现的时间足够长, 使得大多数一方将从节点 B1 设置为新的主节点, 并使用 B1 来代替原来的主节点 B , 那么 Z1 发送给主节点 B 的写命令将丢失。
注意, 在网络分裂出现期间, 客户端 Z1 可以向主节点 B 发送写命令的最大时间是有限制的, 这一时间限制称为节点超时时间(node timeout), 是 Redis 集群的一个重要的配置选项:
集群至少包含三个主节点
集群只有数据库 0,而且也不支持 SELECT 命令
创建集群
环境
需要执行redis-trib.rb,必须要有ruby环境
需要redis-*.gem
需要redis-*.gem
集群启动必须保证redis为空,清除appendonly.aof,dump.rdb,和 cluster-config-file配置的文件
配置
daemonize yes
如果有密码需要配置密码
vi /usr/local/rvm/gems/ruby-2.4.4/gems/redis-4.0.1/lib/redis/client.rb
:password => "root",
redis全部启动后,启动集群
./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
set
SADD key member[member]
添加一个或多个元素到集合中
SCARD key
获取集合中元素数量
SUBTER key [key]
获取集合交集
SINTERSTORE destination key [key ...]
获取集合交集并存储在一个结果集上
SMEMBERS key
获取集合中所有元素
SMOVE source destination member
移动集合中的一个元素到另一个集合
SPOP key [count]
删除集合里的元素
SRANDMEMBER key[count]
随机获取一个元素
SREM key member [member]
集合里删除一个或多个元素
SUNION key[key...]
添加多个set元素
SUNIONSTORE DESTINATION KEY[KEY ...]
合并set元素,并将结果存入新的set
方案
简介
解决redis的高可用问题、可扩展性、维护方便
方案选择
代理:predixy
高可用:sentinel
主从高可用,至少一主一从,三个sentinel
集群:Cluster
方案实施
0 条评论
下一页