redis的定位
redis是基于c语言编写的单线程的,nosql的内存型,kv键值的高性能数据库
redis的线程模型解析
redis6开始,redis在I/O和网络连接都是多线程的,使用了多路复用的技术,主线程仍是单线程的,具体情形可以参考如下图
主线程仍使用单线程,避免了多线程的下的加锁,线程切换等开销。而I/O等连接使用多线程可以防止阻塞,有效提高效率,而网络I/O才是数据库的短板。
redis支持的数据类型
String
redis的string数据类型既可以存数值类型,也可以存字符串具体命令如下:
#设置键值
set test 1
#获取键值
get test 1
#自增
incr test
#自减
decr
#增加10
incrby test 10
#减少10
decr test 10
#设置超时时间
setex test 60 seconds
#查询超时时间
ttl test
#不存在则设置,成功返回值,失败返回0
setnx test 1
#删除键值
del test
Hash
redis的Hash类型常用于保存对象,redis的Hash类型使用两种数据结构ziplist,hashtable
- 当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)
- 所有值都小于hash-max-ziplist-value配置(默认64字节)
ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1),可参考这篇文章
ziplist图
hashtable图
#设置对象
hmset user:10 name:"lin" lin keyword:2018 2018
#根据key和字段名获取键值
hget user:10 keyword:2018
#遍历字段名
hkeys user:10
#查看字段数
hlen user:10
#获取所有字段值
hvals user:10
#遍历字段值和字段名
hscan user:10 0
#查看指定字段是否存在
hexists user:10 keyword:2018
List
list与Java的linkedlist相同,抽象为双向链表,插入的复杂度为o(1),搜索的复杂度为o(n)
#从左插入
lpush list hadoop flink hive redis flume kafka
#从右插入
rpush list es
#返回序号范围队列
lrange list 0 5
#返回指定一个元素
lindex list 1
#插入指定元素之前或者之后
linsert list before flink zookeeper
#插入指定元素之后
linsert list after zookeeper sqoop
#弹出最前的元素
lpop list
#弹出最后的元素
rpop list
#按照索引设置值
lset list 0 hbase
#按照截取指定范围内的值
ltrim list 0 6
#删除指定内容
lrem list 1 sqoop
Set
set集合是唯一的,不可重复的
#加入数据
sadd set flink spark flume
#统计集合个数
scard set
#输出set1和set的差集,主要
sdiff set1 set
#输出与set1与set的交集
sinter set1 set
#遍历集合
smembers set
#将set1和set2的差集输入给set
sdiffstore set2 set1 set
#将set1和set的交集输入给set3
sinterstore set3 set1 set
#输出set1和set的并集
sunion set set1
#将set1的hadoop元素移到set5
smove set1 set5 hadoop
#正则匹配集合元素
sscan set 0 match had*
sortedset
sortedset是排序集合,按照其分数排序
#添加元素
zadd sorted1 1 flink 2 hadoop 3 flink
#查看列表的key
zcard sorted1
数据的持久化策略
reids数据持久化策略有AOF和RDB两种,两种不同策略适用场景不同,RDB数据完整性较低但性能高,AOF则相反
RDB策略
redis的RDB策略是:
- 一 将一定时间段的数据写入临时文件
- 二 单独fork子线程将数据写入持久化文件,主线程不涉及I/O操作 特性:
- 一 持久化文件大小较小
- 二 性能高
- 三 数据安全性较低,会丢失上一个保存点之后的数据
AOF策略
redis的AOF策略是: 是将指令直接写入磁盘中(默认为每秒一次),直接追加到文件末尾,确保极端情况下,只会丢失一秒数据 特性: 一 极端情况下,最多丢失最后一秒的数据 二 需要在redis.conf 中的 appendonly yes 就可以打开 AOF功能 三 性能稍低,由AOF形成的文件较大,需要AOF重写压缩
AOF重写介绍
在进行 AOF 重写时,仍然是采用先写临时文件,全部完成后再替换的流程,所以断电、磁盘满等问题都不会影响 AOF 文件的可用性,根据AOF重写机制,在发生代码错误时,会恢复到上一个重写点,更详细可以查看这篇文章