redis复习

243 阅读4分钟

redis的定位

redis是基于c语言编写的单线程的,nosql的内存型,kv键值的高性能数据库

redis的线程模型解析

redis6开始,redis在I/O和网络连接都是多线程的,使用了多路复用的技术,主线程仍是单线程的,具体情形可以参考如下图

image.png

主线程仍使用单线程,避免了多线程的下的加锁,线程切换等开销。而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

image.png

image.png

image.png

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图

image.png

hashtable图

image.png

#设置对象
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

image.png

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*

image.png

image.png

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重写机制,在发生代码错误时,会恢复到上一个重写点,更详细可以查看这篇文章