存储结构
1:字符
set hello world
get hello
递增数字
incr key 相应的value会+1(原子递增,针对int)
incryby/decr key increment 递增指定的整数(针对int)
以上都是原子操作
append key value :向指定的key追加字符串(加载value上)
strlen key 获得key对应的value的长度
mget key key ….. 同事获得多个key的value
mset key value key value …..
key的设计
对象类型 : 对象id :对象属性:对象子属性
建议对key进行分类,同步在wiki中统一管理
短信重发机制: sms:limit:mobile
====================
2:列表
list ,可以存储一个有序的字符串列表
lpush key value
rpush key value
lpop/rpop key
lien key 获取列表的长度
Irange key start stop: 索引可以是负数。-1表示最有欧变的第一个元素
lrem key count value 删除 个数。值
lset key index value 设置
===========================
3:散列
hash key value
hset person age 20
hset person name mic
hset person name male
hget person name mic
hmset user age 25 sex female name xx
hmget user age sex name
hgetall key 获取hash的所有信息,包括key和value
hsetnx 存在返回0,不存在返回1
hdel key field [field……] 删除一个或者多个
=========================================
4:集合
无序
set和list不同
sadd key member 增加数据 如果value已经存在,则会忽略已经存在的值,并且返回成功加入的元素的数量
srem key member 删除元素
smember key 获得所有数据
5:有序集合
有序
zadd key score member
zrange key start stop [withscores]
如果两个元素的score是相同的,那么根据(0<9<A<Z<a<z)
功能
1:为每个key设置超时时间
2:通过列表类型来实现分布式队列的造作
3:支持发布定于的消息模式
应用场景
1“数据缓存
2:单点登录
3:秒杀抢购
4: 网站排名
5:应用的模块开发
安装
1:下载,tar zxvf
2: 编译 make
3:make test 测试编译
4:make install 安装
5:make install PREFIX=/data/server 安装路径
redis-server 启动服务
Redis-cli 访问redis的控制台
redis-benchmark
性能测试工具
redis-check-aof 文件检查工具
redis-check-dump rdb文件检查工具
redis-sentinel :服务器配置
启动redis ./redis-server ../redis.conf
停止:单机:control+ C
后台:./redis-cli shundown
启动默认单机模式
修改redis.conf
daemonized yes //是否后台运行
访问redis 控制台
./redis-cli -h 192.168.1.1 -p 6379
多数据支持
默认支持16个数据库,可以理解为一个明明空间
跟关系型数据库不一样的点
1:redis不支持自定义数据库名字
2:每个数据库不能单独设置授权
3:每个数据库之间并不是完全隔离的,可以通过flushall命令清空redis实例里的所有数据库的key
select dbid 去选择不同的数据明明空间。
dbid的取值范围默认0-15;
使用入门
1:获得一个符合匹配规则的键名列表
keys pattern [? *[]]
keys mic:rubby
2: 判断一个建是否村子 EXISTS key 存在返回1,不存在返回0
3:type: key 去火的这个key的数据结构类型
各种数据接口的使用
redis 事务处理
multi 开启事务
EXEC 执行事务
设置过期时间
expire key time
ttl key
lua 安装
https://www.runoob.com/lua/lua-environment.html
lua语言好处
Redis中的应用
redis.call("set","key","value");
local var=redis.call("get","key");
1:减少网络开销
2:原子操作
执行时,其他同样的key进行操作,都无法执行
./redis-cli --eval lua.lua
3:复用性
lua脚本的安装
1:tar -zxvf ….
2: make linux
3: make install
输入lua 就可以进入控制台
弱类型语言
变量
全局变量、局部变量
a = 1 ; local b =2
a==b 比较两个值是否相等
~= 不等于
逻辑运算符
and / or
not (a and b)
eval 执行脚本
redis持久化策略
RDB/AOF
可以同时使用,如果同时使用,会优先使用AOF来还原数据
RDB:按照规则,定时将内存的数据同步到磁盘
触发快照情况:
1:自己配置的快照规则
实践:以下三者是||的关系
save <seconds> <changes>
save 900 1 在900s内被更改 的key的数量大于1的时候,执行快照
save 300 10
save 60 10000
2:执行save或者bgsave命令
save: 执行内存数据同步到磁盘的请求,这个操作会阻塞客户端的请求
bgsave:后台异步执行快照操作,不会阻塞
3:执行flushall的时候(清楚所有db里的数据)
清除内存的所有数据,只要有规则就会执行规则
4:执行复制的时候
快照的实现原理
redis会使用fork函数复制一份当前进程的副本(子进程)
redis 的优缺点
1:可能回存在数据丢失的请求(缺点)
2:可以最大化redis的性能(优点)
AOF: 每次执行命令后,将命令本身记录下来, aof会把redis执行的每一条命令追加到磁盘文件中
默认AOF不生效,
如何生效:
更改conf下的appendonly yes :重启后执行对数据的变更命令,会在bin目录下生成对应的aof命令
AOF和rdb同时开启则使用aof
auto-aof-rewrite-percentage 100 表示当前aof文件大小超过上一次aof文件大小的百分比多少的时候会进行重写。如果之前没有重写过,以启动时的大小为标准
auto-aof-reworite-min-suze 64mb 限制允许重写最小aof文件大小,也就是文件小于64mb的时候,不要进行优化
aof重写过程是安全的
同步磁盘数据
redis每次更改数据的时候。apf机制都会将命令记录到aof文件,但是实际上由于操作系统的缓存机制,数据并没有实施写入硬盘,而是进入硬盘缓存,去刷新到保存到新文件
aof安全性高,rdb数据易丢失
// todo 内存回收策略:待补充
redis集群
1:主从(从只能读取,不能操作)
修改从redis的conf 下的slaveof
主机可以通过 info replication 进行查看
实现原理
1: slave链接到master后,会向master发送一个sync指令
2: master收到SYNC的时候,会做两件事
a;执行bgsave(rdb快照)
b:master会把新收到的修改指令存入缓冲区
3:replconf listening-port 6379 sync
集群的缺点:
没有办法对master进行动态选举,如果master挂掉,那么从的也没办法选举,只能读取之前同步的数据
复制的方式:
1:基于rdb文件的复制(第一次链接或者重连的时候)
2:无硬盘复制(conf配置)
3:增量复制 (不需要发送sync命令 而是psync,记录偏移量offset)
哨兵机制
sentinel
当主服务器挂掉是,可以通过哨兵机制,让从服务器变成激活成主的
sentinel.conf
配置三台sentinel
sdown 哨兵主观
0down客观
redis指令
info replication
哨兵机制+redis主从 ====高可用