五大数据类型
String set get key value value全是字符串类型
List L/Rpush L/Rpop key value key是链表头 value是链表节点
Set sadd scard key value 由多个成员组成的集合 key是集合名 value是String类型且无序,唯一的 , 集合的成员
Hash hset hget key value hash是map的集合 key是集合名 value是以string类型的map为集合成员, 适合存储对象
Zset zadd zcard key value 有序集合, key是集合名 value是集合成员, 每次添加成员之前都需要为其添加索引值, 通过索引号排序
三种特殊数据类型
geospatial geoadd geopos 存储经纬度(geo有效经度 -180到180度, geo有效纬度 -85到85度),位置名称到key中, geo是基于zset实现的,可以用zset命令来操作geo
hyperloglog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的
基数统计: 统计集合里不重复的元素数量
bitmap setbit getbit bitcount 不是真正意义上的数据类型只是 string 类型上面向二进制比特位的操作 只有0和1两个状态的flag都可以用bitmap存储
事务本质是一组命令的集合, 在这一组事务执行过程中是会一次性的按照顺序执行且不能被干扰 , 因此redis事务会有 一次性,顺序性, 排他性
在MySQL里的事务都要求ACID四个原则其中原子性 在Redis单条命令是保证原子性的, 但事务不保证原子性的
redis所有事务会在一组命令全部入队后才发起执行命令从第一条命令开始执行, 因此redis没有事务隔离级别的概念
一个事务从开始到执行会经历三个阶段 开启事务(multi)--------->命令入队----------->执行事务(exec)
multi开启事务后, redis输入所有命令都会入队, exec一次性的按队列顺序执行命令
discard 取消事务, 之前入队的命令都会失效且关闭已开启的事务
事务由两个异常
编译型异常, 其中一条命令语法有错误编译不通过, 那么整个事务的都不会去执行
运行时异常, 语法上没有错误, 但运行时操作有异常, 如incr一个string类型的value, 语法上能编译, 也不影响事务中其他命令的执行, 但执行完事务后会抛该命令异常
监视 watch key
悲观锁: 认为什么时候都会出现问题, 无论做什么都会先加锁
乐观锁: 认为什么时候都不会出现问题, 所以无论做什么都不会加锁,
使用 watch 当做 redis 的乐观锁操作: watch 监视指定 key , 当连接1开启事务后需要修改监听中的 key的value 但未执行, 该key被连接2修改了值, , 连接1 exec 执行事务时会先检查监听中的key的值是否有变化,如果有变化则事务失败, 需要 unwatch 解除监视,并重新监视该key到达更新value的目的, 更新value后再重新开始之前连接1 的事务操作
持久化: redis 是内存数据库. 数据断点即失, 所以redis提供了持久化功能
RDB: 配置文件里有一些默认的持久化规则 save...一般不用修改 , 当满足这些规则条件时, 则会对数据进行持久化,数据保存在默认配置里的 dir ./ dbfilename dump.rdb
save规则满足的情况下, 执行 flushall 命令 ,退出redis, 以上条件满足都会持久化数据生成一个 dump.rdb 文件,
恢复 rdb 文件: 把文件放在 >config get dir 的任意目录下, redis 启动是就会自动检查 rdb文件, 恢复其中的数据,
rdb方式持久化数据的优点: 适合大规模恢复数据, 对数据完整性的要求不高
缺点: 需要一定的时间的间隔进行操作, 如果redis宕机了, 最后一次修改的数据就会丢失, fork子进程时会占用一定的内存
AOF: 不存储数据但会以日志的形式记录所有写操作(读不记录)到appendonly.aof文件里, 且只允许追加aof文件不允许修改aof文件, 当redis启动时会读取aof文件并重新构建数据, 但效率会很慢
在配置文件中appendonly no 默认是不开启AOF的, 需要手动配置
如果aof文件被破坏, 可以使用redis自带的修复工具redis-check-aof --fix [FileName]
如果aof文件大于配置文件里的限制的64m大小, redis则会fork一个子进程重写aof文件,防止文件过大
优点: 每一次修改都会同步, 数据的完整性更好
每秒同步一次, 就算宕机也只会丢失1秒的数据
缺点: 相对于rdb来说, aof虽然数据完整性更高,但占用资源远大于rdb, 修复速度也比rdb慢 , 运行效率比rdb, 所以redis默认配置rdb持久化数据