Redis简介
Redis 是Remote Dictionary Server(远程数据服务)的缩写,由意大利人antirez(Salvatore Sanfilippo)开发的一款高速缓存数据库,该软件使用C语言编写,它的数据模型为key-value,它支持丰富的数据结构(类型),比如String、List、Hash、Set、Sorted set。可持久化,保证数据安全。
缓存 有两种类型:数据缓存、页面缓存(smarty),使用缓存可以合理的减轻数据库的负责。在开发网站的时候如果一些数据在短时间内不会发生变化,而它们还有被频繁访问,为了提高用户的请求速度和降低网站的负载,就把这些数据存放在一个读取速度更快的介质上(或者是通过较少的计算量就可以获得该数据),该行为就称为数据的缓存。该介质可以是文件、数据库、内存,内存经常用户数据缓存。
页面缓存经常用在CMS内存管理系统里面。新闻页面适合做页面缓存。
数据缓存经常会用在页面的具体数据里面。商品页面的组成部分根据业务特点,各个部分数据比较独立,适合给他们分别做"数据缓存"。
Redis&Memcache比较
Redis不仅仅支持简单的k/v类型数据,同时还提供list、set、zset、hash等数据结构的存储。
Redis支持master-slave(主-从)模式应用。
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
Redis单个value的最大限制1GB,memcache只能保存1MB的数据。
Redis/src下几个重要文件讲解
redis-cli:终端操作脚本
redis-server:启动redis服务脚本文件
redis-benchmark:压力测试文件
redis-check-aof/redis-check-dump:检测备份文件脚本
redis.conf:daemonize yes(将弄no改为yes,则为后端启动)
Docker安装Redis
docker run -d -p 6379:6379 --name xipikerRedis redis
通过[docker exec -it <容器id||容器名> bash]进入容器
[/src]几个重要文件在 [usr/local/bin/]下面
具体使用
在redis里面,除了空格和"\n"不能作为名字的组成内容外,其他内容都可以作为key的名字部分,名字的长度不做要求。
命令 | 描述 |
---|---|
exists [key] | 测试指定key是否存在 |
del [key] | 删除给定的key |
type [key] | 返回给定key的value类型 |
keys [pattern] | 返回匹配指定模式的所有key |
rename [oldkey] [newkey] | 改key的名字 |
dbsize | 返回当前数据库key的数量 |
expire [key] seconds | 为key指定过期时间 |
ttl [key] | 返回key的剩余过期时间 |
select db-index | 选择数据库 |
move key db-index | 将key从当前数据库移动到指定数据库 |
flushdb | 删除当前数据库中的所有key |
flushall | 删除所有数据库中的所有key |
String类型操作
命令 | 描述 |
---|---|
set [key] value | 设置key对应的值为string类型的value |
mset [key1] [value1] [key2] [value2] | 一次设置多个key值 |
mget [key1] [key2] | 一次获取多个key值 |
incr [key] | 对key的值做加加操作,并返回新的值 |
decr [key] | 同上,但是做的是减减操作 |
incrby [key] [integer] | 同incr,加指定值 |
decrby [key] [integer] | 同decr,减指定值 |
append [key] [value] | 给指定key的字符串追加value |
substr [key] [start] [end] | 返回截取过key的字符串 |
数据类型List链表
list类型其实是一个双向链表,通过push、pop操作从链表的头部或者尾部添加删除元素。这使得list即可以作为堆栈,也可以作队列。上进上出:栈,上进下出:队列。
链表的使用场景:获取最新的用户登录信息"select * from user order by logintime desc limit 10",以上sql语句可以实现用户需求,但是数据多的时候,全部数据都要受到影响,对数据库的负载比较高。必要情况还需要给关键字段(id或logintime)设置索引,索引也比较消耗系统资源。如果通过list链表实现以上功能,可以在list链表中只保留最新的10个数据,每进来一个新数据进来就删除一个旧数据。每次就可以从链表中直接获得需要的数据。极大节省各方面资源消耗。
命令 | 描述 |
---|---|
lpush [key] string | 在key对应list的头部添加字符串元素 |
rpop [key] | 从list的尾部删除元素,并返回删除元素 |
llen [key] | 对应list的长度,key不存在返回0,如果key对应类型不是list返回错误 |
lrange [key] [start] [end] | 返回指定区间内的元素,下标从0开始 |
rpush [key] string | 同上在尾部添加 |
lpop [key] | 从list的头部删除元素,并返回删除元素 |
ltrim [key] [start] [end] | 截取list,保留指定区间内元素 |
数据类型Set
redis的set是string类型的无序集合。
set元素最大可包含(2的32次方-1)个元素。
关于set集合类型除了基本的增删操作,还包括集合取并集(union)、交集(intersection)、差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐功能。
命令 | 描述 |
---|---|
sadd [key] [member] | 添加一个string元素到key对应的set集合中,成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误 |
srem [key] [member] [member2] | 用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略。当 key 不是集合类型,返回一个错误。 |
smove [key1] [key2] [member] | 从key1对应set中移除member然后添加到key2中 |
scard [key] | 返回set的元素个数 |
sismember [key] [member] | 判断member是否在set中 |
sinter [key1] [key2] | 返回所有给定的key的交集 |
sunion [key1] [key2] | 返回所有给定的key的并集 |
sdiff [key1] [key2] | 返回所有给定的key的差集 |
smember [key] | 返回key对应set的所有元素,结果是无序的 |
数据类型Sort set
sorted set是string类型元素的集合,每个元素会关联一个权,通过权值可以有序的获得集合中的元素。
该sort set应用场景:获得热门帖子(回复量)信息:“select * from message order by backnum desc limit 5”;(以上需求可以通过简单sql语句实现,但是sql语句比较耗费mysql数据库资源)。
命令 | 描述 |
---|---|
zadd [key] [score] [member] | 添加元素到集合,元素在集合中存在则更新对应score |
zrem [key] [member] | 删除指定元素,1表示成功,如果元素不存在则返回0 |
zincrby [key] incr [member] | 按照incr幅度增加member的score值,返回score值 |
zrank [key] [member] | 返回指定元素在集合中的排名/下标,集合中元素是按score从小到大排序 |
zrevrank [key] [member] | 返回指定元素在集合中的排名/下标,集合中元素是按score从大到小排序 |
zrange [key] [start] [end] | 类似lrange操作从集合中去指定区间元素。返回的是有序结果 |
zrevrange [key] [start] [end] | 类似lrange操作从集合中去指定区间元素。返回的是按score逆序结果 |
zcard [key] | 返回集合中元素个数 |
zscore [key] [element] | 返回给定元素对应的score |
zremrangebyrank [key] [min] [max] | 删除集合中排名在给定区间的元素 |
数据类型Hash
hash数据类型存储的数据与mysql数据库中存储的一条记录极为相似。
命令 | 操作 |
---|---|
hset [key] [field] [value] | 设置hash field为指定值,如果key不存在则先创建 |
hget [key] [field] | 获取指定的hash field |
hmget [key] [field1] [field2] … | 获取全部指定的hash field |
hmset [key] [field1] [value1] … | 同时设置hash的多个field 和 value |
hincrby [key] [field] [integer] | 将指定的hash field加上指定值 |
hexists [key] [field] | 测试指定field是否存在 |
hdel [key] [field] | 删除指定hash的field |
hlen [key] | 返回指定hash的field数量 |
hkeys [key] | 返回hash的所有field |
hvals [key] | 返回hash的所有value |
hgetall [key] | 返回hash的所有field和value |
持久化功能
redis为了内部数据安全的考虑,会把本身的数据以文件的形式保存到硬盘一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里面。数据保存到硬盘的过程就称为"持久化"效果。
snap shotting 快照持久化
该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中,如果数据非常多(10-20G)就不适合频繁该持久化操作。
该持久化默认保存文件为dump.rdb,可以在redis.conf进行修改,dbfilename参数进行修改
该持久化默认备份频率,可以在redis.conf进行修改:
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #同上
save 60 10000 #同上
以上三个save意思为,数据修改的频率非常高,备份频率也高,数据修改的频率低,备份的频率也低。
快照支持化和精细持久化可以尽最大程度保证数据的安全。
append only file(AOF持久化)
本质:把用户执行的每个"写"指令(添加、修改、删除)都备份到文件中,还原数据的时候就是执行具体写指令来重建整个数据库的内容。
开启AOF持久化(会清空redis内部的数据)。
同时可以修改备份文件的名字,默认是appendonly.aof
appendfsync always //每次收到写命令就立即强制写入磁盘,速度慢,但是可以完全保证持久化,不推荐使用。
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐使用。
appendfsync no //完全依赖os,性能最好,持久化没有保证。
命令 | 描述 |
---|---|
bgsave | 异步保存数据到磁盘 |
lastsave | 返回上次成功保存到磁盘的unix时间戳 |
shutdown | 同步保存到服务器并关闭redis服务器 |
bgrewriteaof | 当日志文件过长时优化aof日志文件存储 |
./redis-cli bgrewriteaof
./redis-cli bgsave
./redis-cli -h 127.0.0.1 -p 6379 bgsave #手动发起快照
Redis主从模式
为了降低每个redis服务器的负载,可以多设置几个,并做主从模式,一个服务器负载"写"(添加、修改、删除),其他服务器负载"读"数据主服务器数据会"自动"同步给从服务器
redis.config [slave-read-only yes] [slaveof localhost port]