redis简介
redis(REmote DIctionary Server)是C语言开发的一个开源的高性能的键值对(key-value)数据库。
特征:
- 数据间没有关系
- 单线程工作方式
- 高性能
- 多数据类型支持
- 字符串类型
- list
- hash
- set
- sortset5.
- 持久化支持
应用:
- 热点信息
- 任务队列,如秒杀、抢购、购票排队
- 及时信息,如排行榜、在线人数、设备信号等
- 分布式数据共享
- 分布式锁
数据类型
string:
-
添加/修改数据
set key value
-
添加/修改多个数据
mset key1 value1 key2 value2...
-
获取数据
get key
-
获取多个数据
mget key1 key2...
-
删除数据
del key
-
获取数据字符串长度
stelen key
-
追加信息(有就添加,否则新建)
append key value
-
数值操作
incr key
//加一incrby key increment
//加指定值incrbyfloat key increment
//加指定值(小数)decr key
//减一incrby key increment
//减指定值 -
设置有生命周期的数据
setex key seconds value
psetex key milliseconds value
hash:
-
添加/修改数据
hset key field value
-
添加/修改多个数据
hmset key field1 value1 field2 value2...
-
获取数据
hget key field
hgetall key
-
获取多个数据
hmget key field1 field2...
-
删除数据
hdel key field1 fields
-
获取hash表中字段数量
hlen key
-
获取hash表中是否存在指定字段
hexists key field
-
获取hash表中所有字段名或者字段值
hkeys key
hvals key
-
数值操作
hincrby key field increment
hincrbyfloat key field increment
-
没有值才操作
hsetnx key field value
list:底层使用双向列表实现
-
添加/修改数据
lpush key value1 value2...
rpush key value1 value2
-
获取数据
lrange key start stop
lindex key index
llen key
-
获取数据并移除
lpop key
rpop key
-
规定时间内获取并移除数据
blpop key1 key2 timeout
brpop key1 key2 timeout
-
移除指定数据
lrem key count value
set:
-
添加数据
sadd key mumber1 mumber2...
-
获取全部数据
smembers key
-
删除数据
srem kay member1 member2...
-
获取数据总量
scard kay
-
判断集合中是否包含指定数据
sismember key member
-
随机获取指定数量的数据
srandmember key count
-
随机获取指定数量的数据并移除
spop key count
-
求交并补
sinter key1 key2
sunion key1 key2
sdiff key1 key2
-
求交并补并存储到指定集合中
sinterstore destination key1 key2
sunionstore destination key1 key2
sdiffstore destination key1 key2
-
将指定数据从原始集合移动到目标集合
`smove source destination member
sorter_set:
-
添加数据
zadd key score1 member1 score2 member2...
-
获取全部数据
zrange key start stop [withscores]
zrevrange key start stop [withscores]
-
删除数据
zrem key member1 member2...
-
按条件获取数据
zrangebyscores key min max [withscores] [limit]
zrevrangebyscores key min max [withscores] [limit]
-
条件删除数据
zremrangebyrank key start stop
zremrangebyscore key min max
-
获取集合数量的总量
zcard key
zcard key min max
-
求交并
zinterstore destination numkeys key [key...]
zunionstore destination numkeys key [key...]
-
获取数据对应的索引
zrank key member
zrevrank key member
-
score值的获取与修改
zscore key member
zincrby key increment member
key通用操作
-
删除指定key
del key
-
获取key是否存在
exists key
-
获取key的类型
type key
-
为指定key设置有效期
expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp
-
获取key的有效时间
ttl key
pttl key
-
切换key从时效性转为永久性
persist key
-
查询key
keys pattern
//其中pattern规则:*匹配任意数量的任意字符;?匹配一个任意字符;[]匹配任意一个指定符号 -
为key改名
rename key newkey
renamenx key newkey
-
对所有key排序
sort key
-
获得帮助
help @generic
数据库通用操作
-
切换数据库
select index
-
其他操作
quit
ping
echo message
-
数据移动删除(相当于剪切)
move key db-index
-
数据清除
flushdb
flushall
-
查看数据量
dasize
Jedis
用java操作redis
-
连接redis
Jedis jedis = new Jedis("127.0.0.1",6379);
-
操作redis
jedis.set("name","zhangsan"); System.out.prientln(dedis.get("name"));
-
关闭redis连接
jedis.close();
Linux环境下安装redis
-
下载安装包
wget http://download.redis.io/releases/redis-4.0.0.tar.gz
-
解压
tar -xvf redis-4.0.0.tar.gz
-
编译
make
-
安装
make install
-
服务启动方式
#默认启动 redis-server redis-server --port 6380 #指定配置文件启动 redis-server xxx.conf
持久化
RDB:保存某个时间点的快照
-
手动命令
save
-
后台保存
bgsave
-
自动保存
通过配置文件
#限定时间内key的变化数量达到指定数量即进行持久化 save seconds changes save 900 1 save 300 10 save 60 1000
-
RDB的特殊启动形式
-
全量复制
-
服务器运行过程中重启
debug reload
-
关闭服务器时指定保存数据
shutdown save
-
AOF(append only file):记录操作过程
存数据策略appendfsync :
-
always
每次操作均同步到AOF文件中,零误差,性能低
-
everysec
准确性较高,性能较高
宕机的时候丢1秒的数据
-
no
系统控制,过程不可控
配置
-
开启AOF,默认不开启
appendonly yes|no
-
配置AOF写数据策略
appendfsync always|everysec|no
-
自定义文件名
appendfilename filename
-
文件路径
dir path
AOF重写规则
-
已经超时的数据不再写入
-
忽略无效指令,只保留最终写数据的指令
-
对同一条数据的多条写命令合并为一条
-
指令
-
手动重写
bgrewriteaof
-
自动重写
-
触发条件设置
auto-aof-rewrite-min-size size
auto-aof-rewrite-percentage percent
-
自动重写触发对比参数
aof_current_size
aof_base_size
-
自动重写触发条件
aof_current_size > auto-aof-rewrite-min-size
(aof_current_size-aof_base_size)/aof_base_size >= auto-aof-rewrite-percentage
-
-
RDB和AOF的区别
持久化方式 | RDB | AOF |
---|---|---|
占用存储空间 | 小(数据级:压缩) | 大(指令集:重写) |
存储速度 | 慢 | 快 |
恢复速度 | 快 | 慢 |
数据安全性 | 会丢失数据 | 依据策略决定 |
资源消耗 | 高/重量级 | 低/轻量级 |
启动优先级 | 低 | 高 |
事务
-
开启事务
multi
-
执行事务
exec
-
取消事务
discard
锁
-
对key添加监视锁
watch key1 key2...
-
取消对所有key的监视
unwatch
分布式锁
-
使用setnx 设置一个公共锁
setnx lock-key value
-
释放锁使用del
分布式锁改良
-
使用expire为锁key添加时间限定,到时间不释放就放弃锁
expire lock-key second
pexpire lock-key milliseconds
删除策略
过期的数据真的删除了吗?
删除策略的目标是在内存占用和cpu占用之间寻找一种平衡
-
定时删除
创建一个定时器,当key设置有过期时间,时间到达时,由定时器立即执行对键的删除操作
优点:节约内存,到时就删除,快速释放不必要的内存占用
缺点:cpu压力大
拿时间换空间
-
惰性删除
数据到达过期时间不做处理,下次访问该数据的时候再删除
优点:节约cpu,到必须删除的时候才删除
缺点:内存压力大,有长期占用内存的数据
拿空间换时间
-
定期删除
轮询每个库,随机检测删除
逐出算法
-
最大可用内存
maxmemory
-
每次选取待删除数据的个数
maxmemory-samples
-
删除策略
maxmemory-policy
-
检测易失数据
- volatile-lru:挑选最近最少使用的数据淘汰
- volatile-lfu:挑选最近使用次数最少的数据淘汰
- volatile-ttl:挑选将要过期的数据淘汰
- volatile-random:任意随机选择数据淘汰
-
检测全库数据
- allkeys-lru:挑选最近最少使用的数据淘汰
- allkeys-lfu:挑选最近使用次数最少的数据淘汰
- allkeys-random:任意随机选择数据淘汰
-
放弃数据驱逐
no-enviction:禁止驱逐数据
-
服务器配置基础
-
设置服务器以守护进程的方式进行
daemonize yes|no
-
绑定主机地址
bind 127.0.0.1
-
设置服务器端口号
port 6379
-
设置数据库数量
databases 16
日志配置
-
设置服务器指定日志级别
loglevel debug|verbose|notice|warning
-
日志记录文件名
logfile 端口号.log
客户端配置
-
最大客户端连接数
maxclients 10
-
客户端闲置等待最大时长
timeout 300
多服务器快捷配置
-
导入并加载指定配置文件信息,用于快捷创建redis公共配置较多的redis实例配置文件,便于维护
include /path/server-端口号.conf
高级数据类型
Bitmaps
-
获取指定key对应偏移量上的bit值
getbit key offset
-
设置指定key对应偏移量上的bit值,value只能是1或者0
setbit key offset value
-
对指定key按位进行交、并、非、异或操作,并将结果保存到destkey中
bitop op destkey key1 key2...
- and
- or
- not
- xor
-
统计指定key中的数量
bitcount key [start end]
HyperLogLog
-
添加数据
pfadd key element1 element1...
-
统计数据
pfcount key1 key2...
-
合并数据
pfmerge destkey sourcekey1 sourcekey2...
GEO
-
添加坐标点
geoadd key longitude latitude member [longitude latitude member]
-
获取坐标点
geopos key member [member]
-
计算坐标点距离
geodist key member1 member2 [unit]
-
根据坐标求范围内的数据
georadius key longitude latitude radius m|km|ft|mi
-
根据点求范围内的数据
georadiusbymember key member radius m|km|ft|mi
-
获取指定点对应的坐标hash值
geohash key member [member]
主从复制
“三高”架构:
- 高并发
- 高性能
- 高可用
将master中的数据及时有效的复制到slave中
一个master(写数据),多个slave(读数据)
作用:
- 读写分离,提高读写负载能力
- 负载均衡
- 故障恢复
- 数据冗余
- 高可用基石
工作流程:
- 建立连接
连接方式:
-
客户端发指令
slaveof masterip masterport
-
启动服务器参数
redis-server --slaveof masterip masterport
-
服务器配置
slaveof masterip masterport
断开连接
slaveof no one
授权访问:
-
master配置文件设置密码
requirepass password
-
master客户端发送命令设置密码
config set requirepass password
config get requirepass
-
slave客户端发送命令设置密码
auth password
-
slave配置文件设置密码
masterauth password
-
启动客户端设置密码
redis-cli -a password
-
数据同步
-
命令传播
心跳机制:
- master心跳:
- 指令:ping
- 周期:由repl-ping-slave-period决定,默认10秒
- 作用:判断slave是否在线
- 查询:
info replication
获取slave最后一次连接时间间隔,lag项维持在0或1视为正常
- slave心跳
- 指令:replconf ack{offset}
- 周期:1秒
- 作用1:汇报slave自己的复制偏移量,获取最新的数据变更指令
- 作用2:判断master是否在线
哨兵
哨兵是一个分布式系统,在主从结构中当出现故障的时候投票选择新的master并将所有的slave连接到新的master。
工作原理
-
监控
-
通知
-
故障转移
集群
配置:
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 30000
cluster-migration-barrier 1
节点操作指令:
-
查看集群节点信息
cluster nodes
-
进入一个从节点redis,切换其主节点
cluster replicate master-id
-
发现一个新节点,新增主节点
cluster meet ip:port
-
忽略一个没有solt的节点
cluster forget id
-
手动故障转移
cluster failover
企业级解决方案
- 缓存预热
- 缓存雪崩
- 缓存击穿
- 缓存穿透
- 性能指标监控