CodeArt-编码艺术

Redis—数据类型、事务、持久化

字数统计: 1,871阅读时长: 7 min
2019/02/15 Share

五种数据类型


  • String(字符串)

Redis最基本的数据类型,一个key对应一个value;

string 类型是二进制安全的。它 可以包含任何数据。比如jpg图片或者序列化的对象;

例如PHP存储对象或数组时,可以通过serialize()进行序列化,取出时unserialize()反序列化

string 类型的值最大能存储 512MB。

  • Hash(哈希)

键值对集合,即编程语言中的Map类型。(PHP中的关联数组,Python中的dict)。

适用场景:存储用户属性等

  • List(列表)

字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边);

即双向链表。

适用场景:消息队列,时间线内容

  • Set(集合)

String类型的无序集合,存储的元素都是唯一的;

Redis还为其提供了求交集、并集、差集等操作。

适用场景:共同好友,访问ip统计

  • ZSet(有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。(分数即权重的概念)

zset的成员是唯一的,但分数(score)却可以重复。

适用场景:排行榜、带权重的消息队列

常用命令


判断一个key是否存在;存在返回1;否则返回0;

1
EXISTS key

删除某个key,或是一系列key;DEL key1 key2 。成功1,失败0(key不存在)

1
DEL key

返回某个key元素的数据类型 ( none:不存在,string:字符,list,set,zset,hash),key不存在返回空

1
TYPE key

返回匹配的key列表 (KEYS foo*:查找foo开头的keys)

1
KEYS key—pattern

随机获得一个已经存在的key,如果当前数据库为空,则返回空字符串

1
RANDOMKEY

清除界面

1
CLEAR

改Key名,新键如果存在将被覆盖

1
RENAME oldname newname

改Key名,更改key的名字,如果newname存在,则更新失败

1
RENAMENX oldname newname

返回当前数据库的key的总数

1
DBSIZE

设置某个key的过期时间(秒)

1
2
EXPIRE key 30 #设置过期时间为 30 秒
SET key "codeart.top" ex 30 #设置过期时间为 30 秒

查询某key过期时间,返回秒

1
TTL key

清空当前数据库中的所有键

1
FLUSHDB

清空所有数据库中的所有键

1
FLUSHALL

读取运行Redis服务器的配置参数

1
CONFIG GET #config get requirepass 查看密码

更改运行Redis服务器的配置参数

1
CONFIG SET

认证密码

1
AUTH you-password

重置数据统计报告,通常返回值为’OK’

1
CONFIG RESETSTAT

查询Redis相关信息(参数为空,返回所有信息)

1
INFO [section]

INFO命令可以查询Redis几乎所有的信息,其命令选项有如下:

server: Redis server的常规信息

clients: Client的连接选项

memory: 存储占用相关信息

persistence: RDB and AOF 相关信息

stats: 常规统计

replication: Master/slave请求信息

cpu: CPU 占用信息统计

cluster: Redis 集群信息

keyspace: 数据库信息统计

all: 返回所有信息

default: 返回常规设置信息

关于Redis的密码


redis速度相当的快,一秒钟可以150K次的密码尝试,所以需要设置一个密码强度很大的密码)。

设置密码的方式有两种:

(1)使用config set 命令的requirepass 参数,具体格式为config set requirepass “you-password”

(2)配置redis.conf 中设置requirepass属性,后面为密码。

输入认证的方式也有两种:

(1)登录时可以 redis-cli -a you-password

(2)登录后使用 auth you-password

事务


Redis的事务处理比较简单。只能保证client发起的事务中的命令可以连续的执行,而且不会插入其他的client命令,当一个client在连接中发出multi命令时,这个连接就进入一个事务的上下文,该连接后续的命令不会执行,而是存放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令。

如果其中执行出现错误,执行正确的不会回滚,不同于关系型数据库的事务。

image

持久化机制


Redis支持两种持久化方式:

两种持久化方式可以同时存在,当Redis重启时,AOF文件会优先被用于重建数据

1.快照(RDB)

特定时间间隔保存一个数据快照,为持久化的默认方式。

将内存中的数据以快照的方式写入到二进制文件中,默认文件dump.rdb,可以通过配置设置自动做快照持久化的方式。可配置Redis在n秒内如果超过m个key被修改就自动保存快照。适合作为灾备;

RDB比AOF性能好,数据量较大的情况下启动更快,在需要持久化时,主进程fork一个子进程进行持久化操作(但假如数据较大,或机器性能较差时会导致服务停止Xms-1S);

RDB容易造成数据的丢失。假设每5分钟保存一次快照,如果Redis因为某些原因不能正常工作,那么从上次产生快照到Redis出现问题这段时间的数据就会丢失了。

1
2
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内如果超过10个key被修改,则快照保存
2.追加式文件(AOF)

追加记录每一个操作

AOF比快照方式有更好的持久化性,是由于使用AOF时,Redis会将每一个收到的写命令都通过write函数写入到文件中,当Redis启动时会通过重新执行文件中保存的写命令来在内存中重新建立整个数据库的内容。
由于OS会在内核中缓存write做的修改,所以可能不是立即写到磁盘上,这样AOF方式的持久化也还是有可能会丢失一部分数据。可以通过配置文件告诉Redis我们想要通过fsync函数强制OS写入到磁盘的时机。

相对于RDB,AOF文件会大不少。

配置文件中的可配置参数:

1
2
3
4
5
6
7
appendonly   yes     //启用aof持久化方式

#appendfsync always //收到写命令就立即写入磁盘,最慢,但是保证了数据的完整持久化

appendfsync everysec //每秒中写入磁盘一次,在性能和持久化方面做了很好的折中

#appendfsync no //完全依赖os,性能最好,持久化没有保证

在redis-cli的命令中,SAVE命令是将数据写入磁盘中。

1
2
3
> help save

> save

从RDB切换至AOF:

  • 备份一个最新的dump.rdb的文件,并把备份文件放在一个安全的地方。

  • 运行以下两条命令:

    1
    2
    $ redis-cli config set appendonly yes
    $ redis-cli config set save "" #禁用RDB的持久化方式(非必须),因为两者可共存
  • 确保数据跟切换前一致。

  • 确保数据正确的写到AOF文件里。

记得对配置文件redis.conf进行编辑启用AOF,因为命令行方式修改配置在重启Redis后就会失效。

参考文章

1.实验楼Redis

2.Redis持久化

CATALOG
  1. 1. 五种数据类型
  2. 2. 常用命令
  3. 3. 关于Redis的密码
  4. 4. 事务
  5. 5. 持久化机制
    1. 5.1. 1.快照(RDB)
    2. 5.2. 2.追加式文件(AOF)
  6. 6. 参考文章