redis

一.概述

redis基于内存持久化,高性能的NoSql的key-value数据库.redis支持数据的持久化,可以将数据保存在磁盘中,重启时可以加载使用。redis持久化策略包括RDB,AOF。redis提供key-value类型的数据,同时还提供list,set,zset.hash类型的数据,redis单个key可存储512M大小,默认端口6379

二.配置文件

redis的配置文件为redis.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
daemonize yes # 以守护进程启动
port 6379 # 指定端口
bind 127.0.0.1 #绑定本机,只有本机可以访问
databases 16 # 默认的数据库的个数
# redis RDB持久化策略的持久化操作
save 900 1 每900秒有一次更新操作,做持久化操作
save 300 10
save 60 10000
dbfilename dump.rdb # RDB持久化的镜像文件
slaveof <masterip> <masterport> #主从复制
requirepass foobared #设置密码
maxclients 10000 # 允许客户端连接的最大线程数
maxmemory <bytes> #指定redis最大内存限制
appendonly no #指定是否在每次更新操作后进行日志记录,redis默认情况是异步的将数据写入磁盘
appendfilename "appendonly.aof":# 指定更新日志文件名

三.数据类型

  • 客户端启动和关闭
1
2
redis-cli -h host -p port -a passwd
redis-cli shutdown
  • string类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
set key val # 设置key和val
exists key # 判断key是否存在
expire key seceonds # 设置key的过期时间
ttl key # 查看key的过期时间
persist key # 移除过期时间
rename key newkey # 修改key的名字
move key db # 将key移动到指定数据库
type key # 查看key的数据类型
strlen key # 查看key的长度
setnx key val # 如果key不存在,则创建
getrange key start end # 获取key的指定字符串
incr key# 自增
incrby key num # 自增num
decr key # 自减
decrby key num # 自减num

应用场景:计数,微博数,粉丝数

  • hash类型:string类型的field和value映射表,可以用来存储java对象,内部实际是一个hashmap,每个 hash 可以存储 232 -1 键值对
1
2
3
4
5
6
7
8
9
10
11
hset key field value # 设置key value
hget key field # 获取 value
hmset key f1 v1 f2 v2 # 设置多个值
hgetall key  # 获取hash表中key的所有字段
hkeys key 获取hash表中key的所有字段
hlen key 获取hash表中key的字段数
hdel key field1 field2 # 删除key中的属性
hsetnx key field value # 如果key不存在,则创建
hincrby key field num # 自增num
hincrbyfloat key field num # 自增num
hexists key field # 判断key中的属性是否存在

应用场景:存储对象

  • list类型:列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),list是一个双向链表。列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)
1
2
3
4
5
6
7
8
9
10
11
12
lpush key v1 v1 v3... #将一个或多个值插入列表头部
rpush key v1 v2 v3... #将一个或多个值插入列表尾部
lpushx key value #将一个值插入到已存在的列表头部,如果列表不存在,操作无效
rpushx key value #将一个值插入到已存在的列表尾部,如果列表不存在,操作无效
llen key //获取列表长度
lindex key index //通过索引获取列表中的元素
lrange key start stop //获取列表指定范围的元素
lpop key 从左删除
rpop key 从右删除
blpop key timeout 移除并且获取列表第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出数据为止
brpop key timeout 移除并且获取列表最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出数据为止
ltrim start end 保留指定下标的数据

应用场景:twitter的关注列表,粉丝列表,消息队列

  • set:集合是通过hashtable实现的,概念和数学中的集合基本类似,可以交集,并集,差集等等,set中的元素是没有顺序的。所以添加,删除,查找的复杂度都是O(1)。
1
2
3
4
5
6
7
8
9
10
11
12
13
sadd key v1 v2 ...
scard key 获取集合的成员数
smembers key 返回集合中的所有成员
sismember key member 判断member是不是集合key的成员
srandmember key [count] 返回集合中一个或多个随机数
srem key member1 member2... 移除集合一个或多个 成员
smove source dest member将member元素从source移动到destnation集合
sdiff k1 k2 返回给定集合的差集
sdiffstore k12 k1 k2 将k1 k2的差集存储在k12
sinter k1 k2 交集
sinterstore k12 k1 k2 将k1 k2的交集存储在k12
sunion k1 k2 并集
sunionstore k12 k1 k2 将k1 k2的并集存储在k12

应用场景:存储一个列表数据,不希望有重复值。set具有求交集,差集,并集的功能,方便实现共同关注,共同好友

  • sorted set(zset):有序集合,存储的也是string类型元素的集合,不允许有重复的成员,每个元素都会关联一个double类型的分数,redis通过分数为集合中的成员进行从小到大的排序,有序集合的成员是唯一的,但是分数可以重复,集合是通过hash来实现的,添加查找删除的时间复杂度都是1.
    集合中最大成员数为2的32次方减1
1
2
3
4
5
6
7
8
9
zadd key score1 member1 score2 member2 添加多个成员
zcard key 获取有序集合的成员数
zcount key min max 返回有序集合指定期间分数的成员数
zrank key member 返回有序集合中指定成员的索引
zrange key start stop [withscores] 通过索引区间返回有序集合指定区间内的成员
zrevrange key start stop [withscores] 通过索引区间返回有序集合指定区间内的成员,分数有高到低、
zrem key member [member] 移除集合中一个或多个成员
zremrangebyrank key start stop 移除有序集合给定的排名区间所有成员
zremrangebyrange key min max 移除有序集合中给定的分数区间的所有成员

应用场景:排行榜,带权重的消息队列

  • flush
1
2
flushdb 清除当前数据库所有的key
flushall 清除整个redis的数据库所有key

四.发布订阅

1
2
3
4
5
subscribe channel [channel]  订阅某个频道
psubscribe pattern [pattern] 订阅一个或多个符合指定模式的频道
publish channel message
unsubscribe channel [channel] 退订频道
punsubscribe pattern [pattern] 退订所有给定模式的频道

应用场景:构建实时消息系统,比如即时聊天,群聊,博客,公众号

五事物

redis批量操作在exex之前,被放入到队列缓存,收到exec命令后进入事物执行。如果事物中有任意命令执行失败,其它命令依然被执行.redis会将一个事物中的所有命令序列化,然后按顺序执行,执行过程中不会被其他命令插入.

1
2
3
4
5
multi:标记一个事物的开始
exec:执行命令
discard 取消事物,放弃执行事物块内的所有命令
watch:监视一个或多个key watch key [key]如果在事物执行之前这个key被其它命令所改动,那么事物将被打断
unwatch:取消watch命令对key的监视

如果执行的某个命令报错,则只有报错的命令不会被执行,其它的命令会被执行
回滚:当队列中的某个命令出现报告错误,执行时整个队列的命令都被取消

六.redis持久化

redis数据存放在内存(高效,断电数据会丢失)当内存不足时,redis会根据配置的缓存策略淘汰部分key
以保证写入成功,当无淘汰策略时或没有找到合适的key时,redis直接返回out of memory

淘汰策略

1
2
3
4
5
6
7
8
9
在redis中,允许用户设置最大使用内存大小 maxmemory 512G
volatile-lru:从已设置过期时间的数据中挑选最近最少使用的数据淘汰
volatile-lfu:从已设置过期时间的数据中,删除一段时间内使用次数最少
volatile-ttl:从已设置过期时间的数据中,挑选最近要过期的
volatile-random:从已设置过期时间的数据中随机淘汰一些数据
allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
allkeys-lfu:从所有keys中,删除一段时间内最少使用的数据
allkeys-random:从数据集中随机选择数据淘汰
no-enviction(驱逐):禁止驱逐数据,不采用任何淘汰算法。默认的设置

redis持久化机制

  • rdb:是redis的默认持久化机制,rdb相当于快照,保存的是一种状态.将内存中的数据一快照的方式写入到二进制文件中去,默认为dump.rdb

    优点:快照保存数据极快,还原数据极快,适用于灾难备份

  • AOF(Append-only file):由于快照方式是在一定时间间隔,所有如果redis以为down掉的话,就会丢失最后一次快照后的所有修改,如果要求不能丢失任何修改的化,可以采用aof持久化方式.aof持久化方式:将每一个写命令都通过write函数追加到文件(appendonly.aof),当redis重启时会通过执行文件中的保存的写命令在内存中重建整个数据库.

    1
    2
    3
    4
    appendonly yes # 开启AOF
    # appendfsync always 收到写命令立即写入到磁盘,最慢,但是保证完全的持久化 
    appendfsync everysec 每秒钟写入到磁盘一次
    # appendfsync no 完全依赖os,性能好,持久化没保证
文章目录
  1. 1. 一.概述
  2. 2. 二.配置文件
  3. 3. 三.数据类型
  4. 4. 四.发布订阅
  5. 5. 五事物
  6. 6. 六.redis持久化
|
载入天数...载入时分秒...