目录
一、redis介绍
redis为什么快,因为是单线程的,没有多线程的CPU上下文切换,是基于内存操作的
redis默认有16个数据库,默认使用的是第0个
select n 切换到弟n个数据库
dbsize 查看当前数据库大小
keys * 查看当前数据库中所有的key
exists key 判断当前数据库该key是否存在
del key 删除当前数据库该key的键值对
flushdb 清空当前数据库中所有的键值对
flashall 清空所有数据库中的键值对
二、5种基本数据类型
1. String
value除了是字符串还可以是数字
主要命令:
set 设置值;get 获取值;
setex key timeout value 设置key的并设置过期时间;setnx key 不存在key再设置(用于分布式锁);
incr/decr key 对key自增/减1; incrby key 10 对key自增10;decrby key 10 对key自减10;
getrange key m n 截取[m,n]字符串;getrange key 0 -1 获取全部字符串;
......
使用场景:
1. 计数器;2. 粉丝数;3. 对象缓存存储(需要把对象格式化成json键值对)
......
2. List;
list实际上是一个链表,可以进行双端操作的,可以用来做栈(先进后出)、队列(先进先出);
主要命令:
lpush key value 插入值;rpush key value 插入value值到key的最右端;
lrange key 0 2 取出[0,2]的元素(像栈);lrange key 0 -1取出key中的所有值;
lpop key从左侧头部弹出;rpop key 从右侧头部弹出;
......
小结:
1. 如果key不存在,则创建新的链表;存在,则新增内容;
2. 一处所有元素,空链表也代表不存在;
3. 在两边插入或改动,效率高,中间元素,效率相对低;
使用场景:消息队列,栈
3. Set
set是string类型的无序不重复集合,是通过hash表实现的。所以添加、删除、查找的时间复杂度是O(1)。
主要命令:
sadd key value;往集合key中添加值;smembers key 获取集合key中全部的元素
sinter/sunion key1 key2 ... keyn 求key1 key2 ... keyn的交/并集;
......
4. Hash
hash是string类型的key value的映射表。相当于map集合,reids<key, map<key ,value>>
主要命令:
hset key k1 v1... kn vn 设置key的value值k1 v1... kn vn(kv键值对);
hset key k1 ... kn vn 获取key中的k1 v1... kn vn;
hgetall key 获取key中所有的value((kv键值对));
...
hset student1 name Jorry
hset student1 age 18
...
hgetall student1 获取student1的全部信息(k,v键值对)
hincby student1 age 2 给student1的学生age字段+2
...
经常变更的信息,用户类数据信息,hash更适合对象存储,string更适合字符串存储;
5. Zset
有序集合
三、3种特殊数据类型
1. geospatial(地理位置)
使用经纬度地理坐标计算距离,如:附近的人定位
2. hyperloglog(基数统计)
计算数据集中不同元素的个数,如:计算页面方位量(一个用户多次访问算一个人)
3. BitMaps(位图):
使用位存储,信息状态只有0和1,如:状态统计,签到统计
四、redis事务
相比较数据库事务的ACID,redis没有隔离性(i),因此没有隔离级别的概念
redis的单条命令是可以保证原子性的,但是redis的事务不能保证原子性!
redis事务的本质:一组命令的集合,被按顺序序列化,按顺序执行,不允许其他命令干扰
A. 开启事务:multi
B. 命令入队
C. 执行事务:exec
事务出错
1. 代码语法错误(编译时异常:redis错误命令执行报错,如:abcd k1),所以命令都不执行
2. 代码逻辑错误(运行时异常:事务执行时,逻辑错误报错,如:对字符串进行incr key1 ),其他命令可正常执行(所以不能保证原子性)
五、redis监控实现乐观锁
1. 悲观锁,很悲观,认为什么时候都会出问题,所以无论怎样都会加锁,效率低
如:mysql的select ...for update
2. 乐观锁,很乐观,认为什么时候都不会出问题,所以无论怎样都不会加锁,效率高
如:mysq表中加version字段实现悲观锁,更新时,1. 现查version;2. 比较version;3. 一致时更新,否则不更新
redis使用watch key实现监控key,相当于乐观锁加锁
Thread1: set money 100; set use 0;
Thread1: watch money;multi;decrby money 20;incrby user 20;
Thread2: incrby money 600;
Thread1: exec(nil)//没有结果说明执行失败
事务exec执行之前,其他线程修改了值,事务执行失败,需要解锁获取新值后再加锁执行事务
unwatch进行解锁,每次exec执行事务后,都会自动释放锁,不管成功与否
2336

被折叠的 条评论
为什么被折叠?



