redis学习总结
目录
一、NoSQL概述
NoSQL即(Not Only SQL),具有易扩展,大数据量高性能,灵活的数据类型,高可用的特点。
二、数据结构及常用命令
1、Redis 虽然是作为数据库开发的,但由于其提供了丰富的功能,越来越多的人将其用作:缓存、队列系统等。
缓存:Redis可以为每个键设置生存时间(Time To Live, TTL),生存时间到期后键会自动被删除。
Redis还可以限定数据占用的最大内存空间,在数据达到空间限制后可按照一定的规则自动淘汰不需要的键。
队列:Redis的列表类型键可以用来实现队列,并支持阻塞式读取,可以很容易的实现一个高性能的优先级队列。
2、关系数据库中要获取posts表内id为1的记录的title字段的值,可以用如下sql:
select title from posts where id = 1 limit 1
相应的,在Redis中要读取键名为post:1的散列类型键的title字段的值,可以使用如下命令:
HGET post:1 title
3、字符串
- 二进制安全的,存入和获取的数据相同
- value最多可以容纳的数据长度为512M
redis > SET bar 1 建立一个名为bar的键 set key value
redis > get bar 获取一个名为bar的键的值 get key
redis > KEYS * 获得redis中所有的键
redis > KEYS bar 获得redis中键为bar
redis > KEYS ba* 获得redis中所有以ba开头的键
redis > EXISTS bar 如果键存在返回整数类型1,否则0
redis > del bar 删除键 返回的是删除键的个数
redis > type key 获取键值的数据类型:string hash list set zset
redis > incr key 递增key对应的值,不存在此key开始默认0,key类型不是整数时报错
redis > incrby key 8 指定加多少
redis > decr key
redis > decrby key 8
redis > incrbyfloat key 3.4
redis > append key value 向键值的末尾追加value,返回值是追加后的字符串的总长度
redis > strlen key
redis > mset key1 v1 key2 v2 key3 v3 同时设置多个键值
redis > mget key1 key2 key3 同时获得多个键值
4、散列类型 hash
字段值只能是字符串,不支持其他数据类型嵌套。适合存储对象使用对象类别和id构成键名
例子:键 字段(filed) 字段值
car:2 color white
name aodi
price 900000
相比于关系数据库,我们可以为任何一条记录新增属性,而不需要考虑其他记录。
命令:
hset key field value
hget key field
hmset key field value field1 value1 field2 value2
redis > hset car price 500
redis > hset car name BMW
redis > hget car name
redis > hmget car price name
redis > hgetall 获取键中所有字段和字段值
redis > hexists key field 判断字段是否存在 存在返回1否则0
redis > hincby key field 5
redis > hdel key field
redis > hkeys key 只获取字段名
redis > hvals key 只获取字段值
redis > hlen key 获取字段数量
5、列表类型 list
可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素、或者获得列表的某一个片段。
列表类型内部使用双向链表实现.
经常用于消息队列的一些服务,完成多个程序之间的消息的交互。
lpush key value 向列表左边增加元素
rpush key value 向列表右边增加元素,返回值表示增加元素后列表的长度
lrange queue 0 3 查询队列元素,queue是队列名,从0位置开始,查询三个元素
lpop key 从列表左边弹出一个元素
rpop key 从列表右边弹出一个元素 返回被移除的元素值
llen key 列表长度
lrange key start end 获取列表片段,从0开始计数,包含两段
lrem key count value count大于0,从左边开始删除前count个值为value的元素,小于0从右边,等于0,删除所欲。
redis > lpush numbers 1 [1]
redis > lpush numbers 2 [2 1]
redis > lpush numbers 3,4 [4 3 2 1]
redis > rpush numbers 5,6 [4 3 2 1 5 6]
6、集合类型 set
集合中的元素,无序、不重复,而列表类型是有序、重复,正好相反。
由于集合类型在redis内部是使用值为空的散列表 hash table 实现的,所以加入、删除、查找元素的时间复杂度都是o(1)
还可以多个集合类型键之间并集、交集等等。
用于跟踪一些唯一性数据,维护数据对象之间的关联关系。
SADD key member 增加元素
SREM key member 删除元素
SISMEMBER key member 判断元素是否在集合中 存在返回1,否则0
SMEMBERS key 获取集合中的所有元素
redis > sadd set1 a
redis > sadd set1 a b c
redis > srem set1 b
集合间运算
sdiff key key1 差集
redis > sadd setA 1 2 3
redis > sadd setB 2 3 4
redis > sdiff setA setB 返回1
sinter key key1 交集
redis > sinter setA setB 返回2 3
sunion key key1 并集
redis > sunion setA setB 返回1 2 3 4
redis > sadd letters a
redis > sadd letters b
redis > smembers letters 返回所有元素 a b
redis > scard letters 返回个数 2
redis > sdiffstore destination setA setB :A和B差集存在destination
redis > srandmenber key 随机获取一个元素
7、有序集合类型 zset
在集合类型的基础上,为每个元素都关联一个分数。
使用场景:
- 如大型在线游戏积分排行榜
- 构建索引数据
zadd key score member
zscore key member 获得元素的分数
zrange key start end 获得排名在某个范围的元素列表
zrangebyscore key min max 获得指定分数范围的元素
zincrby key increment member 为某个元素增加分数
redis > zadd socreboard 100 zhengchao 90 liuzhen 80 china
redis > zscore scoreboard zhengchao
redis > zrange socreboard 0 2
redis > zrangebyscore scoreboard 80 100
redis > zincrby scoreboard 20 zhengchao
redis > zcard key 获得集合中元素的数量
redis > zcount scoreboard 90 100 获得指定分数范围内的元素个数
redis > zrem scoreboard china 删除一个或多个元素
8、事务
redis > multi 声明一个事务开始
redis > sadd key value
redis > sadd key1 value1
redis > exec 提交
redis > discard 回滚
语法有错误,整个执行都不会生效
运行错误,成功的就成功了
9、生存时间
Redis中可以使用expire命令设置一个键的生存时间,到时间后,redis会自动删除它
语法:
expire key seconds ,其中seconds参数表示键的生存时间,单位是秒
redis > set session:95528 “普法银行”
redis > expire session:95528 900 15分钟有效期,返回1表示成功
查询一个键剩余时间:
ttl key 返回还剩余生存时间,单位秒
取消设置生存时间(即设置为永久):
persist key
10、选择数据库
redis默认有16个数据库,默认使用的是第0号数据库。
redis > select 1 选择1号数据库
redis > move key 1 将当前数据库的key移动到1号数据库
三、redis持久化
1、概述
redis 高性能是因为在内存中,内存中同步到硬盘中就是持久化操作。
2、持久化方式:
RDB方式,默认的方式,无需配置。指定将内存中的数据写入到磁盘中的频率
AOF方式,以日志的形式存储redis数据库中的数据(操作日志),当redis数据库重启时将读取日志中的数据。
可以配置为不进行持久化,redis就当一个缓冲使用。可以同时使用RDB和AOF。
RDB
优势: 1.数据库只包含一个文件,通过文件备份策略,定期配置,恢复系统灾难 2.压缩文件转移到其他介质上 3.性能最大化,redis开始持久化时,分叉出进程,由子进程完成持久化的工作 ,避免服务器进程执行I/O操作,启动效率高。
劣势:如果持久化以前,宕机,也就是30s持久化一次,25s的时候宕机,这25s的数据了还没写到硬盘就没了。
redis 默认使用RDB 方式持久化
save 900 1 每900秒至少一个key发生变化,就保存一次
save 300 10
save 60 10000
dbfilename dump.rdb 数据文件名
保存的路径是 dir ./ 也就是当前路径下
AOF
AOF持久化
优势:1.更高的数据安全性, 分为每秒同步,每修改同步,不同步三种方式。
2.对于日志的写入方式采用append模式,在写的过程中发生宕机,写了一半,宕机,下次启动前工具会解决数据一致性问题。
3.如果日志过大,redis会启动重写日志。
- 每秒同步也是异步完成的,效率也非常高。但是若在这一秒之内发生宕机,则在这一秒中修改的数据就丢失了。
- 每修改同步即我们可以将其视为同步持久化,每一次发生变化都立即记录到磁盘中。效率低但安全。
劣势:如果宕机 这1s的数据就没了。
每修改同步,安全,但是效率慢。
对于日志的写入方式采用append模式,在写的过程中发生宕机,写了一半,宕机,下次启动前工具会解决数据一致性问题。如果日志过大,redis会启动重写日志。
例如误使用flushall命令情况了数据库,则打开日志文件appendonly.aof,把flushall命令删除,重启redis,则数据会恢复。