目录
前言
非关系型数据库
基础理论
什么是redis
基于c语言开发的key-value内存高速缓存数据库
特点
- 性能好,每秒可以处理10万次读写操作
- 支持多种数据结构:string,list,set,zset,hash
优缺点
缺点:
- 数据库容量收到物理内存的限制
优点:
- 速度快
- 支持丰富的数据类型
- 支持事务,操作都是原子性
- 丰富的特性,可用于缓存、消息,设置有效期等。
与memcache相比的优势
- 丰富的数据类型
- 速度快
- 支持持久化
原生使用
操作数据
string
set company "itcast"
get name
del name
# 存十秒
set company itcast EX 10
list
# 写入
lpush mylist a b c
# 从头部(第一个)读取一个
lpop mylist
# c
# 从尾部(后边)读取一个
rpop mylist
# a
set
sadd myset a b c
# 获取所有
smembers myset
# 删除指定
srem myset a b
zset
hash
hset myhash username haohao
hget myhash username
hdel myhash username username2 //可以删除多个
通用命令
keys pattern
keys *
del key1 key2…
del company
exists key
exists compnay
# 1代表存在
type key
返回的字符串为string、list、set、hash,如果key不存在返回none
type company
其他命令
incr key 给key加1,如果不存在则新建并初始化为0,加1后为1
存储方式
rdb
默认存储方式
存储的名字、位置、频率
save 900 1
save 300 10
save 60 10000
# The filename where to dump the DB
dbfilename dump.rdb
# For default save/load DB in/from the working directory
# Note that you must specify a directory not a file name.
dir ./
aof
开启
appendonly yes
# 默认会在目录下产生一个appendonly.aof文件,rdb存储的会丢失
# redis-cli config set appendonly yes 命令开启,rdb数据不丢失
appendfsync always 每执行一次更新命令,持久化一次
appendfsync everysec 每秒钟持久化一次
appendfsync no 不持久化
无持久化
#save 900 1
#save 300 10
#save 60 10000
appendonly no
save ""
常见性能问题和解决方案
问题:
rdb:Master写内存快照,当快照比较大时会很大影响性能,所以master不要写内存快照;
aof:aof文件过大也会影响master重启速度,所以不要做任何持久化,rdb影响最大;
解决:
如果数据比较关键,在某个slave开启aof备份数据即可。
为了主从复制的性能,slave和master最好在同一个局域网。
并发竞争问题如何解决
redis为单进程单线程模式,采用队列模式将并发访问变成串行访问。
所以多个客户端并不存在竞争,但是jedis客户端对redis并行访问时,会发生链接超时、客户端关闭等问题。
解决:
事务
示例:
> MULTI 开启
OK
> INCR foo 操作,如果不正确会报错,只是入队失败,不影响前后的命令
QUEUED
> INCR bar
QUEUED
> EXEC 执行
1) (integer) 1
2) (integer) 1
不能回滚
失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现
简单且快速
使用 check-and-set 操作实现乐观锁
如果在 WATCH 执行之后, EXEC 执行之前, 有其他客户端修改了 mykey 的值, 那么当前客户端的事务就会失败。 程序需要做的, 就是不断重试这个操作, 直到没有发生碰撞为止。
这种形式的锁被称作乐观锁, 它是一种非常强大的锁机制。
WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC
缓存失效策略
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
使用场景
会话缓存(Session Cache)
全页缓存(FPC)
队列
排行榜/计数器
ZRANGE user_scores 0 10 WITHSCORES
发布/订阅
订阅频道
subscribe CCTV1
发布频道信息,订阅端会立即收到并显示
publish CCTV1 "cctv1 is good"