Redis学习(中阶)
Posted 程序彤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis学习(中阶)相关的知识,希望对你有一定的参考价值。
nosql作用
1.减少cpu、磁盘io压力,通过从内存中读取数据。
2.作为缓存数据库,减少io读操作。
Redis数据结构应用场景
list:最新的10条稿件
zset:排行榜top10
set:去除大量数据中的重复数据
string:
hash:
zset:排行榜
expire:手机验证码过期
docker部署redis
docker start redis
docker exec -it redis bash
默认端口号6379 Merz
Redis和memcache区别
1.Redis采用单线程+多路IO复用,而memcache采用多线程+锁
Redis命令
string
expire key2 10:设置参数10s后过期
setnx key 20 value:在设置时就设置过期时间
exists key2:存在为1,不存在为0
del key2:删除指定key
unlink key2:先奏后斩型删除
select:切换数据库
dbsize:查看当前数据库有多少个key
flushdb:清空当前库
flushall:通杀全部库
setnx:当set不存在时,才能设置成功。
list
lpush:从左边push值
rpush:从右边push值
lrange key 0 4:遍历
lpop:从左取出list中的值
rpop:从右取出list中的值
set
sadd key9 v1 v2 v3:无序存
smembers key9:取出无序
scard key9:元素个数3
srem key9 v2 v3:删除v2、v3
spop:随机pop
smove:多个set间的操作
hash
hset user01:1001 id 1命令单个存
hmset user02:1001 id 1 name wangrui age 21
hget user01:1001 id:取
hexists user01:1001 id:判断是否1存在,0不存在
hkeys user01:1001:显示全部key
hvals user01:1001:显示全部value
hsetnx user01:1001 age 30 返回0代表不能添加,因为已存在
zset
zadd top1 100 java 200 c 300 python:有序添加
zrange top1 0 -1 withscores:有序遍历
zrangebyscore top1 100 200:遍历分数在100-200的值,若加分数后缀withscores
zrevrangebyscore top1 500 100 withscores:倒序遍历
zincrby/zrem/zcount/zrank
Redis特性
1.redis由于是单线程操作,故是原子操作,不会被线程调度机制打断。
Redis数据结构
string字符串
1.底层数据结构为 简单动态可修改字符串SDS,同ArrayList采用预分配冗余空间来减少内存分配
2.扩容机制:当字符串长度小于1M时,扩容加倍现有的空间。当字符串长度大于1M时,扩容一次只会扩容1M空间。字符串最大长度为512MB。
list列表
1.底层数据结构为quickList(双向链表+ziplist),查询效率较低。
set无序集合
1.string类型的无序集合,底层是v为null的哈希表。增删改查0(1)快。
zset有序集合
1.有序集合,且key不可重复,底层两个数据结构,hash表+跳表(给value排序),
跳跃表:分层,第3层找不到到第二层到第一层。
Hash表
1.key(string)-value(object),适合存储对象,类似hashmap。数据结构,少ziplist+多hash表
新类型1:Bitmaps
对字符串的位进行操作, 1个字节8bit位,abc由三个字节组成,分别对应的ASCII码分别是97/98/99,对应的二进制为01100001/01100010和01100011。
新类型2:HyperLogLog
统计网站PageView访问量,可使用incr/incrby实现。但统计uv呢?使用hyperloglog用来做基数计算,基数就是不重复的元素个数。pfadd/pfcount/pfmerge,自动去重处理。
新类型3:Geospatial
经纬度存储运算
geoadd china:city 121.47 31.23 shanghai
geopos china:city shanghai
Redis配置文件
目前的我处于就业阶段,在此想留下一些自己的小思考,小感悟:有的人觉得月入8k就知足,有的人一个月能拿1w块,有的人月入15k觉得存不下钱,有的人凭借自己的努力本科毕业月入20k+,每个人的追求似乎都有所不同,如果你想创业却只能白手起家,如果你也和大多数人一样只是平民出身,如果你不能靠脸吃饭,如果你并非非同常人,如果你想过上你想要的生活,那就只能凭借知识去改变。这里的“想要的生活”,恐怕每个人所想又不太一样。说白了,现在的我,时常很羡慕,时常很知足,又时而很不甘,明白学海无涯,学无止境,追求自己想要的生活也无止境,只要不要让自己原地停留,一直向前走,能多走也不少走就够了叭、
Redis发布和订阅
消息的通信方式
先第一个会话窗口订阅频道,subscribe channel1,然后在另一个会话窗口publish channel1 hello,redis。此时,第一个会话窗口将会收到消息。
Jedis-maven
Jedis基本命令测试
1.maven引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.3</version>
</dependency>
2.测试jedis-api
Jedis模拟验证码
Redis事务
特性(无acid)
1.单独的隔离性,所有命令序列化按顺序执行,不会被其他客户端发来的命令请求所打断。
2.没有隔离级别,队列中的命令没有exec之前都不会实际被执行,因为事务提交exec前任何命令都不会提前执行。
3.不保证原子性,事务如果有一条命令失败,其余命令仍有可能执行成功。
执行事务命令
命令multi(组队阶段)开始匹配,接下来所有人会进入QUEUED,继而exec(执行阶段)接受。
只要队列中出现一次error,最终exec都将失败,如下:
但如果进入队列潜在不报错的失败,最终exec只会那一个命令失败,如下:
Redis事务乐观锁和悲观锁
定义与场景
悲观锁:每次都上锁。释放锁-上锁-释放锁的一个反复循环的过程
乐观锁场景:抢票(多人抢(读),一人支付(写)。每次都不会上锁,但是在更新的时候会判断再次期间别人有没有去更新这个数据(使用版本号),可提高吞吐量。
redis命令
在执行multi之前,先执行watch k1 v1,可以监视key。如果事务在执行之前这个key被其他命令其他事务所改动,那个这个事务将会被打断终止。unwatch取消事务监视。
以上是关于Redis学习(中阶)的主要内容,如果未能解决你的问题,请参考以下文章