NoSQL:非关系型数据库、不仅仅是SQL
解决的问题:
- 提高读写效率
- 减轻数据库压力
reids
redis常用指令
keys *
查看当前库所有keyexists key
判断某个key是否存在(1代表有,0代表没有)type key
查看你的key是什么类型del key
删除指定的key数据unlink key
根据value选择非阻塞删除(仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作)expire key 10
10秒钟:为给定的key设置过期时间ttl key
查看还有多少秒过期,-1表示永不过期,-2表示已过期select index
命令切换数据库,下标从0开始,共有16个数据库dbsize
查看当前数据库的key的数量flushdb
清空当前库flushall
通杀全部库
redis增删改查操作
String操作
- 添加数据
set key value
- 获取数据
get key
- 修改 如果key存在就是修改;key不存在就是添加
set key value
- 删除
del key
- 只有当key不存在时,才添加
setnx key value
- 将给定的 value 追加到原值的末尾
append <key> <value>
- 获得值的长度
strlen <key>
- 同时获取一个或多个 value
mget <key1> <key2> <key3> .....
- 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。原子性,有一个失败则都失败 (1表示成功,0表示失败)
msetnx <key1> <value1> <key2> <value2> .....
List操作
- 添加
lpush key value1 value2 ...
向头部添加元素
rpush key value1 value2 ...
向尾部添加元素 - 按照下标获取元素
lindex key 下标
lrange key start stop
遍历指定范围内的元素 - 删除某个元素
lpop key
删除第一个元素
rpop key
删除最后一个元素 - 修改指定位置元素
lset key index value
- 获得列表长度
llen <key>
- 从左边删除n个value(从左到右)
lrem <key> <n> <value>
Hashes操作
- 添加 如果字段存在 就是修改
hset key field value
hmset key field value field1 value2 ...
- 获取某个字段值
hget key field
hmget key field1 field2 field3 ...
hgetall key
获取所有的字段以及字段值
hkeys key
获取所有的字段
hvals key
获取所有的值
hdel key field
删除指定的字段 - 批量设置hash的值
hmset <key1> <field1> <value1> <field2> <value2>...
Set操作
- 添加
sadd key value1 value2
- 获取
smembers key
- 删除
srem key value1 value2
- 更新
先删除 再添加 - 判断集合 是否为含有该 值,有1,没有0
sismember <key> <value>
- 返回该集合的元素个数。
scard <key>
- 随机从该集合中吐出一个值,会从集合中删除
spop <key>
- 随机从该集合中取出n个值。不会从集合中删除 。
srandmember <key> <n>
sortedset(zset) 有序集合 按照分数排序;每个元素都会关联一个分数
- 添加
zadd key score1 value1 score2 value2 ......
- 获取
zrange key start stop
获取指定范围的元素
zrange key start stop withscores
获取指定范围的元素以及分数 - 删除
zrem key value1 value2 ...
删除指定的元素 - 返回该值在集合中的排名,从0开始。
zrank <key> <value>
- 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
zrangebyscore key minmax [withscores] [limit offset count]
- 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从大到小)次序排列。
zrevrangebyscore key maxmin [withscores] [limit offset count]
redis的持久化
rdb:存数据(默认)
RDB的实现方式为,在指定时间将当前时刻内存中的数据生成一个快照文件(.rdb文件,默认为dump.rdb),并将这个快照文件保存到磁盘上。这样,即使redis宕机了,下次重启时也可以通过读取这个快照文件来恢复数据。
aof:存操作
AOF是redis提供的另一种数据持久化方式,它会记录客户端对redis服务端的每一次写操作,并将这些写操作以redis协议追加保存到后缀为aof的文件末尾。在redis服务器重启时,会读取并加载aof文件,达到恢复数据的目的。
rdb和aof的优缺点
RDF
RDB优点:
RDB 是一个比较紧凑的文件,它保存了 Redis 在某个时间点的数据,这种数据比较适合做备份和用于灾难恢复。比如说,你可以在最近的 24 小时内,每小时备份一次 RDB 文件,并且在每个月的每一天,也备份一个 RDB 文件。 这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。
RDB 的缺点
如果你需要尽量避免在服务器故障时丢失数据,那么 RDB 不适合你。 虽然 Redis 允许你设置不同的保存点来控制保存 RDB 文件的频率, 但是, 因为 RDB 文件需要保存整个数据集的状态, 所以它并不是一个轻松的操作。 因此你可能会至少 5 分钟才保存一次 RDB 文件。 在这种情况下, 一旦发生故障停机, 你就可能会丢失好几分钟的数据。
AOF
AOF 的优点
1,使用 AOF 做持久化,可以设置不同的 fsync 策略,比如无 fsync ,每秒钟一次 fsync ,或者每次执行写入命令时 fsync 。
AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据。
fsync 会在后台线程执行,所以主线程可以继续努力地处理命令请求。
2,AOF 文件是一个只进行追加操作的日志文件,不是生成新的之后替换掉那种,即使日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途停机,等等), redis-check-aof 工具也可以轻易地修复这种问题。
3,Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。
整个重写操作是绝对安全的,因为 Redis 重写是创建新 AOF 文件,重写的过程中会继续将命令追加到现有旧的 AOF 文件里面,即使重写过程中发生停机,现有旧的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。
4,AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSH ALL(清空整个 Redis 服务器的数据(删除所有数据库的所有 key )。) 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。
AOF 的缺点
对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。
根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB。 在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。
不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)。