redis总结

前言

非关系型数据库

基础理论

参考1

参考2

什么是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"

java操作

posted @ 2018-11-24 15:52  田云  阅读(422)  评论(0编辑  收藏  举报