学习redis
前言:学习redis不用说,要在linux的环境,虽然Windows也有,不过线上不会去用,所以linux命令是基础。
废话不多说,开始学习!
起步:
redis官网:redis.io。(现在的很多技术网站的域名都是io结尾的)
下载安装:
- 解压到 /usr/local 目录
- make安装下。可能会遇到一些情况,比如gcc没有安装什么的,自己安装一下
- 执行make install命令。这一步也可以不需要,执行该命令只是把redis的执行程序安装到path下,任意目录就可以访问了
注:下载安装可以执行Linux的命令下载,我是直接官网下载拷贝的过去
启动:
几种方式的启动
./redis-server 客户端启动方式
./redis-server & 后台启动方式
./redis-server ../redis.conf &或者不加 修改配置文件后,带上配置文件启动
nohup ./redis-server &加或不加 输出启动信息文件为nohup的文件
注:启动完,结束的时候可能会报错,说什么文件不能保存。原因是安装目录下没有读写权限,可以使用root用户操作,或者给该目录授权。启动仅仅只是启动,不代表可以使用,使用在下面的步骤。
关闭:
kill pid 杀掉暴力版不推荐
./redis-cil shutdown客户端关闭,它会让正在操作的命令执行完毕才关闭
初使用:
使用:
./redis-cli开始使用
也可以输入(适用于远程连接):./redis-cli -h 加ip号 -p 加端口号 -a 密码 --raw(终端可以显示中文)
常用命令:
ping 返回 pong 证明服务启动正常
select 数字(0-15) 切换库。redis默认为16个库,可以自己配置
flushall 清空该库的数据
config get *或者指定匹配 查看配置的信息
dbsize 查看当前库的key数量
info 查看redis的服务信息
详情可以参考文档:
- 中文文档:redisdoc.com
- 英文文档:redis.io/commands
注:不熟悉的命令可以敲Tab提示
key的相关命令:
keys *或者指定匹配查询列的名字
move key db(几号库)把那个key移动到几号库
set key的名字 要设置的值设置值
setex key的名字 时间(秒) 设置的值设置值几秒后过期
get key的名字取值
getset key的名字 设置的值设置新值,返回久值
type key的名字获取值的类型
incr key的名字自增一(仅仅针对字符串类型的)
decr key的名字自减一(仅仅针对字符串类型的)
del key的名字删除值
redis存储的数据类型:
字符串的操作前面已经说过了。
list:(允许重复)
形式:key [a,b,c,d,e]
lpush:将一个或多个值插入列表的左边
rpush: 将一个或多个值插入列表的右边
lrange:取元素,可指定范围。0为第一个,-1为最后一个。例:lrange 0 -1,取出全部数据
lpop:删除左边一个
rpop:删除右边一个
lindex:根据下标取指定元素
set:(不允许重复)
sadd:放数据
smembers:取数据
sismembers:判断是否为set 中元素。1为有,0为没有
scard:取总数
srem:删除元素
zset:(有序集合)
根据分值排序,相当于java的TreeSet
zadd:放数据。例:zadd key 1 A 2 B 3 C。key为键值,数字为分值,ABC为具体的值
zrem:删除数据。例:zram key A
zrange:取值。跟list的相同
zcard:取总数。
zrank:从小到大排列,返回索引。例:zrank key A ->1
zrevank:从小到大排列。与上面相反。例:zrevank key A ->3
Hash:
hset:存值。例:hset key name "张三"。
hget:取值。例:hget key name ->张三
hgetAll:取出所有的值。
事务:
multi开启事务
业务逻辑
exec提交
注:事务为弱事务,只要是能入队成功,就会插入部分数据
例:multi
㈠set k1 k1
㈡set k2 <--有问题,没有设置值
exec
提交后,㈠依然可以插入成功,㈡提示报错
悲观锁:
一般来说都会使用版本控制。
id | money | version |
1 | 100 | 1 |
2 |
B后操作数据100,把100变成了80,提交的时候version首先回去判断是否大于真正的version,不大于说明有人先操作的数据,B提交的请求失效,不予更新。
这种版本的控制保证了数据的一致性。
watch:
watch是redis中保证数据的安全性的一种方式。redis去监视某一值,当操作这个数据的时候发现被被人改过了,就自动放弃该事务。
例:watch key进行监视key
持久化:
RDB:指定的时间将内存的数据写入磁盘。(默认开启的)
配置文件配置:
save 秒 次数。
dbflenam dump.rdb保存的数据文件
dir ./保存的位置
AOF:
把之前执行过的命令记录下来,启动时重新执行一遍
配置文件:
appendonly默认为on。改为yes开启
appenfilename名字。文件名
写入命令的策略:
appenfsync no ->隔30秒同步一次
always ->每次都同步
everysec ->每一秒同步一次
redis集群:
主从复制:
主负责写数据,同时把数据同步到从的机器上。
方式之一:
配置文件配置如下:
主:
include
daemonize yes ->后台运行
port 6380 ->端口
pidfile /var/run/redis_6380.pid
logfile 6380.log
dbfilename dump6380.rdb
从:
daemonize yes ->后台运行
port 6381 ->端口
pidfile /var/run/redis_6381.pid
logfile 6381.log
dbfilename dump6381.rdb
slavof 主的ip 主的端口
命令:info replication 查看信息
如果主机器挂掉后,可以使用冷处理的方式(手动方式)处理:
提升某一台从机器为主:slaveof no one
然后其他的从机器挂过去:slaveof ip号 端口
高可用哨兵
当主挂掉后自动的提升某一台从为主,其他的从自动的挂过去。
sentinel.conf配置文件名
启动哨兵: ./redis-sentinel ../sentinel.conf
配置文件的修改:
port 端口号
sentinel monitor 名字
需要监控的redis的ip 端口 2(投票数)。
什么是投票数:
如果启动了三个哨兵来监控主机器(一般启动多个,因为哨兵也会挂掉),A哨兵发现redis挂掉了,B、C哨兵也会去判断是否挂掉了,三个哨兵之间会进行通讯,跟人一样进行投票决定是否提升从的权限来恢复运行,若投票数大于了一半,就通过了。
安全:
1.重命名命令的名字:
配置文件中添加:
rename-command 命令的名字 新的名字。例:flushall的命令修改
2.禁用命令:
rename-command 命令的名字 “”
3.改变端口port
4.设置访问的ip
bind xxx.xxx.xx.xx
特点:
- 足够简单和稳定
- 支持丰富的数据类型
- 内存读写速度快,性能优
- 提供持久化的支持
- 支持部分事务操作