五大数据类型
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 的事务操作