在学习Redis之前,我们应该带着几个问题来学习:
1、 Redis的特殊之处在哪里?
2、 Redis解决什么问题?
3、 使用Redis的时候,应该注意点什么?
普遍认为Redis是一个可持久化的key-value内存数据库。但也有人认为这样定义Redis有点不太准确。Redis有5种数据类型,只有其中一种是典型的key-value结构。理解这五种数据类型,了解他们是怎么实现的,知道他们能提供的方法,以及想想怎么用他们来重塑一些业务,才是学习Redis的关键所在。
其实关系型数据库,也是一种数据结构---表。表既是复杂的,又是稳定的。我们可以用表构建很多很多的业务模型,但是表也有缺点。表在某种情况会丢失简单和快。如果数据本身就是scalars,lists,hashes,or sets为什么不直接存储城scalars,lists,hashes,orset?为什么查找一个数据的使用比exsits(key) 或慢于O(1)的方法?
一、Databases(数据库)
Redis 同样也有数据库概念。在Redis中对数据库的命名是用数字,从零开始。
数据库的数量也是在redis.conf中配置:
EXPIRE key seconds
为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。
设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
databases 16
二、Commands,Keys and Values(命令、键值)
Key是String类型,Value可以有不同的类型。不管Value的类型是什么,
Redis都是把它作为字节数组处理。Value的类型,是依赖于不同的类型驱动来解析的。不同类型经常使用的命令如下:
Keys(键):
KEYS * 匹配数据库中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo
DEL key [key ...]
删除给定的一个或多个 key 。
不存在的 key 会被忽略。
EXISTS key
检查给定 key 是否存在。
String(字符串):
APPEND key value
如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
DECR 和 INCR(针对字符串的操作,因为 Redis 没有专用的整数类型,所以 key 内储存的字符串被解释为十进制 64 位有符号整数来执行 INCR 或DECR操作。)
DECR key
将 key 中储存的数字值减一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
INCR key
将 key 中储存的数字值增一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
Hash(哈希表):
hset users:test name Tom
hget users:test name
hmset users:hello name hello password 123abc
hmget users:hello name password
hgetall users:hello
hkeys users:hello
hdel users:hello password
List(列表):
lpush sys.user zhangsan lisi wangwu
lindex 0 ##返回wangwu
Set(集合):
SortedSet(有序集合):
三、Memory andPersistence(内存存储和持久化)
Redis 本身支持持久化,通过在一定时间间隔或触发操作,将内存中的数据同步到磁盘来保证持久化。Redis 支持两种持久化方式,一种是 Snapshotting(快照),保存为dump.rdb文件,也是默认方式,另一种是 Append-only file(缩写aof)的方式,保存为 .aof 文件。
Snapshotting配置:
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000 #60秒内容如超过10000个key被修改,则发起快照保存
如果我们需要关闭快照,只需要将这几行注释了,然后重启 redis 即可。
如果是正在运行的实例,可以使用 redis-cli的命令
# 查看当前配置
config get save
# 关闭快照
config set save ""
来在线更新配置,输出OK表示设置成功
Aof配置:
appendonly yes //启用aof持久化方式
# appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no //完全依赖os,性能最好,持久化没保证
在线更新配置使用
# 查看当前配置
config get appendfsync
# 关闭快照
config set appendfsync no
通过这两个配置,redis就可以完全在内存运行。