0
点赞
收藏
分享

微信扫一扫

redis笔记--数据类型---事务---发布订阅

工程与房产肖律师 2022-03-31 阅读 70
java

安装完Redis后,

在redis命令下各个文件作用

在这里插入图片描述
Redis是单线程+多路IO复用技术
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)。

五大数据类型

1、string

string是redis最基本的类型
string类型是二进制安全的。
string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M

set key value 设置key value

get key 查看当前key的值

del key 删除key

append key value 如果key存在,则在指定的key末尾添加,如果key存在则类似set

strlen key 返回此key的长度

这几个命令必须要是数字才能够进行操作
incr key 为执定key的值加一

decr key 为指定key的值减一

incrby key 数值 为指定key的值增加数值

decrby key 数值 为指定key的值减数值

2、list

它是一个字符串链表,left、right都可以插入添加;
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全移除,对应的键也就消失了。
链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。
它的底层实际是个链表

lpush key value1 value2 将一个或多个值加入到列表头部

rpush key value1 value2 将一个或多个值加入到列表底部

lrange key start end 获取列表指定范围的元素 (0 -1)表示全部

lpop key 移出并获取列表第一个元素

rpop key 移出并获取列表最后一个元素

lindex key index 通过索引获取列表中的元素

llen 获取列表长度

lrem key 0(数量) 值,表示删除全部给定的值。零个就是全部值 从left往right删除指定数量个值等于指定值的元素,返回的值为实际删除的数量

ltrim key start(从哪里开始截) end(结束位置) 截取指定索引区间的元素,格式是ltrim list的key 起始索引 结束索引

3、set

Redis的Set是string类型的无序,不能重复的集合。

sadd key value1 value 2 向集合中添加一个或多个成员

smembers key 返回集合中所有成员

sismembers key member 判断member元素是否是集合key的成员

scard key 获取集合里面的元素个数

srem key value 删除集合中指定元素

srandmember key 数值 从set集合里面随机取出指定数值个元素 如果超过最大数量就全部取出,

spop key 随机移出并返回集合中某个元素

smove key1 key2 value(key1中某个值) 作用是将key1中执定的值移除 加入到key2集合中

sdiff key1 key2 在第一个set里面而不在后面任何一个set里面的项(差集)

sinter key1 key2 在第一个set和第二个set中都有的 (交集)

sunion key1 key2 两个集合所有元素(并集)

4、hash

Redis hash 是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

kv模式不变,但v是一个键值对类似Java里面的Map<String,Object>

hset key (key value) 向hash表中添加一个元素

hget key key 向hash表中获取一个元素

hmset key key1 value1 key2 value2 key3 value3 向集合中添加一个或多个元素

hmget key key1 key2 key3 向集合中获取一个或多个元素

hgetall key 获取在hash列表中指定key的所有字段和值

hdel key key1 key2 删除一个或多个hash字段

hlen key 获取hash表中字段数量

hexits key key 查看hash表中,指定key(字段)是否存在

hkeys key 获取指定hash表中所有key(字段)

hvals key 获取指定hash表中所有value(值)

hincrdy key key1 数量(整数) 执定hash表中某个字段加 数量 ,和incr一个意思

hincrdyfloat key key1 数量(浮点数,小数) 执定hash表中某个字段加 数量 ,和incr一个意思

hsetnx key key1 value1 与hset作用一样,区别是不存在赋值,存在了无效。

5、zset

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。
redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

zadd key score 值 score 值 向集合中添加一个或多个成员

zrange key 0 -1 表示所有 返回指定集合中所有value

zrange key 0 -1 withscores 返回指定集合中所有value和score

zrangebyscore key 开始score 结束score 返回指定score间的值

zrem key score某个对应值(value),可以是多个值 删除元素

zcard key 获取集合中元素个数

zcount key 开始score 结束score 获取分数区间内元素个数

zrank key vlaue 获取value在zset中的下标位置(根据score排序)

zscore key value 按照值获得对应的分数

redis事务

1、什么是redis的事务

redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体,就是一个队列。当执行的时候,一次性按照添加顺序依次执行,中间不会被打断或者干扰。

2、redis事务基本操作

开启事务:multi 设置事务的开始位置,这个指令开启后,后面所有的指令都会加入事务中

执行事务: exec 设置事务的结束位置,同时执行事务,与multi成对出现,成对使用

取消事务:discard 终止当前事务,取消multi后,exec前的所有指令
在这里插入图片描述
注意:加入事务的命令并没有立马执行,而且加入队列中,exec命令后才执行

/*
单独的隔离操作 
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 

没有隔离级别的概念 
队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题 

不保证原子性 
Redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚 
*/

那么为什么要做成事务的?
eg:
双十一去参加抢购
在这里插入图片描述
在这里插入图片描述
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。

监控key
watch: 对key进行监控,如果在exec执行前,监控的key发生了变化,终止事务执行
unwatch: 取消对所有的key进行监控

redis发布订阅

publish: 发布消息 语法:publish channel名称 “消息内存”

subscribe: 订阅消息 语法:subscribe channel名称

subscribe: 使用通配符订阅消息 语法: pubscribe channel*名称

punsubscribe: 使用通配符退订消息。语法:punsubscribe channel*名称

unsubscribe : 退订消息 语法:unsubscribe channel名称

删除策略

定时删除–>以CPU内存换redis内存

惰性删除–>以redis内存换CPU内存

定期删除

redis使用:惰性删除+定期删除

1.redis在启动的时候读取配置文件hz的值,默认为10

2.每秒执行hz次serverCron()–>databasesCron()—>actveEXpireCyle()

3.actveEXpireCyle()对每个expires[*]进行逐一检测,每次执行250ms/hz

4.对某个expires[*]检测时,随机挑选N个key检查

如果key超时,删除key

如果一轮中删除的key的数量>N*25%,循环该过程

如果一轮中删除的key的数量小于等于N25%,检查下一个expires[  ]

current_db用于记录actveEXpireCyle()进入哪个expires[ * ] 执行,如果时间到了,那么下次根据current_db继续执行

举报

相关推荐

0 条评论