Redis简介
要想了解redis就需要知道什么是非关系型数据库NoSQL(not only sql)?
sql数据库适合用于关系特别复杂的数据查询场景,nosql反之;sql对事务的支持非常完善,而nosql基本不支持事务,两者在不断地取长补短,呈现融合趋势。
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。Redis是 NoSQL技术阵营中的一员,它通过多种键值数据类型来适应不同场景下的存储需求,借助一些高层级的接口使用其可以胜任,如缓存、队列系统的不同角色
特性和优势
应用场景
redis安装与配置
以ubuntu为例:
# 下载
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
# 解压
tar xzf redis-4.0.9.tar.gz
# 移动,放到usr/local?录下
sudo mv ./redis-4.0.9 /usr/local/redis/
# 进?redis?录
cd /usr/local/redis/
# 生成
sudo make
# 测试,这段运?时间会较?
sudo make test
# 安装,将redis的命令安装到/usr/local/bin/?录
sudo make install
# 安装完成后,我们进入目录/usr/local/bin中查看
cd /usr/local/bin
ls -all
redis-server redis服务器
redis-cli redis命令行客户端
redis-benchmark redis性能测试工具
redis-check-aof AOF文件修复工具
redis-check-rdb RDB文件检索工具
# 配置?件,移动到/etc/?录下
sudo cp /usr/local/redis/redis.conf /etc/redis/
核心配置选项
简单命令
# 查看帮助?档
redis-ser查看redis服务器进程ver --help
#
数据操作
redis是key-value的数据结构,每条数据都是?个键值对
键的类型是字符串
注意:键不能重复
值的类型分为五种:字符串string、哈希hash、列表list、集合set、有序集合zset
# string类型
增、改
如果设置的键不存在则为添加,如果设置的键已经存在则修改
set name itcast 设置键为name值为itcast的数据
setex aa 3 aa 设置键为aa值为aa过期时间为3秒的数据
mset a1 python a2 java a3 c 设置键为a1值为python、键为a2值为java、键为a3值为c
append a1 haha 向键为a1中追加值haha
获取
get name 获取键name的值
mget a1 a2 a3 获取键a1、a2、a3的值
# 键命令
查找键,参数?持正则表达式
keys * 查看所有键
exists a1 判断键是否存在,如果存在返回1,不存在返回0
type key 查看键对应的value的类型
del key1 key2 … 删除键及对应的值
expire key seconds 设置过期时间,以秒为单位
ttl key 查看有效时间,以秒为单位
# hash类型
增加、修改
hset user name itheima 设置键?user的属性name为itheima
hmset u2 name itcast age 11 设置键u2的属性name为itcast、属性age为11
获取
hkeys u2 获取键u2的所有属性
hvals key 获取所有属性的值
hget u2 name 获取键u2属性name的值
hmget u2 name age 获取键u2属性name、age的值
删除
hdel u2 age 删除键u2的属性age
# list类型
增加
lpush a1 a b c 从键为a1的列表左侧加?数据a 、 b 、c
rpush a1 0 1 从键为a1的列表右侧加?数据0、1
linsert a1 before b 3 在键为a1的列表中元素b前加?3
获取
lrange a1 0 -1 获取键为a1的列表所有元素
lset a 1 z 修改键为a的列表中下标为1的元素值为z
删除
lrem a2 -2 b 从a2列表右侧开始删除2个b
ltrim key 0,4 截取
# set类型
? ?序集合
? 元素为string类型
? 元素具有唯?性,不重复
? 说明:对于集合没有修改操作
增加
sadd a3 zhangsan sili wangwu 向键a3的集合中添加元素zhangsan、lisi、wangwu
获取
smembers a3 获取键a3的集合中所有元素
删除
srem a3 wangwu 删除键a3的集合中元素wangwu
# zset类型
有序集合
每个元素都会关联?个double类型的score,表示权重,通过权重将元素从?到?排序
增加
向键a4的集合中添加元素lisi、wangwu、zhaoliu、zhangsan,权重分别为4、5、6、3
zadd a4 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan
获取
zrange a4 0 -1 获取键a4的集合中所有元素
zrangebyscore a4 5 6 获取键a4的集合中权限值在5和6之间的成员
zscore a4 zhangsan 获取键a4的集合中元素zhangsan的权重
删除
zrem a4 zhangsan 删除集合a4中元素zhangsan
zremrangebyscore a4 5 6 删除集合a4中权限在5、6之间的元素
其他特性及高级用法
事务
提供了基本的事务支持,可以允许一组指令操作按照原子性(不被打断的情况下)执行,
但是并没有提供回滚操作的支持,而且一组指令中如果有指令执行出错,也不会终止事务的执行,事务会继续执行下去,把后续的指令都执行完。
- multi 开启事务
- exec 执行事务
watch指令 监视
一般会结合着redis事务的 multi 、exec一起使用
首先可以使用watch 让redis帮助我们监视某些redis数据的变化,然后再创建事务,当要开始执行事务的时候,如果由watch监视的变量(数据)发生了变化,则redis事务的任何指令都不会被执行,事务直接停止,如果watch监视的变量(数据)没有发生变化,则redis事务会执行到底(不被打断)。
持久化
redis可以将数据写入到磁盘中,redis支持持久化
- RDB 快照持久化 默认开启
- 将内存中的redis的所有数据,写入磁盘文件
- redis会创建子进程来执行
- 执行的时机:
- 定期持久化 (自动)
save 900 1 # 900秒内进行过1次写操作
save 300 10 # 300秒内进行过10次写操作
save 60 10000 # 60秒内进行过10000次写操作
修改redis配置文件 可以调整 /etc/redis/xxxx.conf
- BGSAVE (手动)SAVE
- SHUTDOWN (手动) 关闭
- 缺点:需要将内存中的所有redis数据全部写入到磁盘,性能有开销影响,不会太快 优点:相比AOF 而言 持久化的磁盘文件 要小很多
- AOF 追加文件方式持久化 默认不开启的 如果开启 appendonly yes
- 将执行过的redis 写操作 记录到磁盘文件中
- 执行的时机:
# appendfsync always # 每执行一个写操作,就立即记录到磁盘中
appendfsync everysec # 每秒写入一次磁盘
# appendfsync no # redis本身不再保证每个操作或每秒中都能立即写入磁盘,而是有操作系统决定把缓存的写操作何时写入磁盘
- redis指令执行时间的数量级 : 1秒钟可以执行10000+的指令
- 优点: 持久化记录的执行效率相比RDB 稍高,缺点: 持久化产生的磁盘文件很大(因为记录了所有的操作)
- RDB 可以和AOF同时使用
Redis 复制集
redis 主从同步, 起到了数据备份的作用
- 可以在运行的redis中 执行slaveof指令
- 可以在配置文件中 执行redis从属于另外哪台机器
可以使用info Replication 查看机器的主从角色
一般slave机器 (备份机) 是不支持写操作的
在redis的主从同步 复制集机器中 一般不会在进行读写分离了
redis复制集 只能一主 多从
哨兵 sentinel
是redis官方提供的 用于管理主从机器 (复制集) 集群,可以方便的进行redis服务器监视、自动故障转移等操作
哨兵实际上就是一个单独运行的进程 redis-sentinel ,这个程序已经随着redis服务的安装一起安装好了,只需要运行即可。
作用:
- Monitoring 监视 帮助我们判断哪些redis服务程序已经死掉,哪些还在存活
- 用网络通讯完成 定期的发送网路包(心跳包) 比如每1s发送一次 心跳机制
- Notification 通知
- Automatic failover 自动故障转移 (核心)
- 在master死掉的时候,选出一个新master,并且将其他slave都slaveof这个新master
- Configuration provider 配置提供
总结: 一般只要使用了redis的复制集,就会一起配合使用哨兵,来完成高可用
使用方式:
redis-sentinel? /etc/redis/xxx.conf
# 配置文件
bind 127.0.0.1 ? # 哨兵运行的ip
port 26380 ? # 哨兵运行的端口
daemonize yes? # 是否以后台的守护进程方式运行
logfile /var/log/redis-sentinel.log
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
# 说明
sentinel monitor mymaster 127.0.0.1 6380 2
* mymaster -> 我们给让哨兵监视的这个redis复制集集群起的名字,以master为主
* 2 表示是有几台以上的哨兵程序判断 redis服务死掉,才进行故障转移
- 哨兵程序至少要运行三个以上
- 要求哨兵程序尽量分散,分散到不同的机器里,不要一窝端
- 哨兵为了完成故障转移,会自动修改redis的配置文件,所以仅仅依靠redis配置文件判断机器的主从角色,并不是很方便, 可以使用info Replication 查看机器的主从角色
其中redis还有许多相关命令,具体可以参考官方文档doc.redisfans.com,还有更多的内容包括redis主从和集群的配置,还有redis实战,都可以从下面这本资料中学习到,超级好用。列举一些截图:
作者简介:Python菜鸟工程师,将在接下来的一段时间内与大家分享一些与Python相关的知识点。如若文中出现问题,各位大佬多多指点,互相学习。喜欢的关注一个吧!谢谢!