当前位置:网站首页>Redis学习
Redis学习
2022-08-03 13:41:00 【努力的张张】
Redis学习
这个系列大概二十个章节,目前已经学完了,分章节更
6、key键操作
keys * 查看当前库所有key(匹配:key *1)
exist key 判断某个key是否存在
type key查看key的类型
del key 删除指定的key’数据
unlink key 根据value选择非阻塞删除(仅将keyspace元数据中删除,真正的删除会在后序异步操作)
expire key 10 给key设置过期时间单位秒
ttl key 查看还有多久过期,-1表示永不过期 -2表示已过期
select 命令切换数据库
dbsize 查看当前数据库的key的数量
flushdb 清空当前库
flushall 通杀全部库
7、redis常用数据类型
字符串String
string类型是二进制安全的。意味着redis的string可以包含任何数据。如jpg图片挥着序列化的对象。
一个redis中字符串value最多可以使512M
常用命令:
set key value:添加键值对
- NX:当key不存在时,可以将key-value添加数据库;
- XX:当key存在时,可以将key-value添加数据库,与NX参数互斥
- EX:key的超时秒数
- PX:key的超时毫秒数,与EX互斥
- 重复会覆盖value
get key:查询对应键值
append key value :将给定的value追加到原值的末尾
strlen key 获得值的长度
setnx key value:只有在key不存在时,设置key的值
incr key:
- 将key中存储的数字值加1
- 只能对数字值操作,如果为空,新增值为1
decr key:
- 将key中存储的数字值减1
- 只能对数字值操作,如果为空,新增值为-1
incrby/decrby key步长:将key中存储的数字值增减,自定义步长
incr和decr是原子性操作(不会被线程调度机制打断的操作)
- mset key1 value1 key2 value2…:同时设置一个或者多个key-value对
- mget key1 key2… :同时获取一个或者多个value
- msetnx key1 value1 key2 value2…:同时设置一个或者多个key-value对,当且仅当给定的所有key都不存在(原子性,有一个失败则都失败)
- getrange key 起始位置 结束位置:获得值的范围,类似java中的substring,前包后包
- setrange key 起始位置 value:用value覆盖key所存储的字符串值,从起始位置开始(索引从0开始)
- setex key 过期时间 value:设置键值的同时设置过期时间,单位秒
- getset key value:以新换旧,设置了新值同时获得旧值
数据结构:
string的数据结构是简单的动态字符串,是可以修改的字符串,内部结构类似于java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b01JWkpk-1659156278093)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220704100921035.png)]](/img/9e/94fc77538454f974e41f5190a6a686.png)
列表List
单键多值
事件单的字符串列表,按照插入顺序排序
底层是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
常用命令:(左放就是逆序,右放就是正序)
lpush/rpush key value1 value2… :从左边/右边插入一个或者多个值
lpop/rpop key:从左边/右边吐出一个值,值在键在,值光键亡
rpoplpush key1 key2:从列表右侧吐出一个值,插入到key2列表的左边
lrange key start stop:按照索引下标获得元素(从左到右)lrange name 0 -1
lindex key index :按照索引下表获得元素(从左到右)
llen key :获得列表长度
linsert key before value newvalue :在value的后边插入newvalue
lrem key n value:从左边删除n个value(从左到右)
lset key index value :将列表下标为index的值替换为value
数据结构:list的数据结构是快速链表quicklist。首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。
她将所有的元素一起挨着存储,分配的是一块连续的内存
当数据量比较多时,才会改成quicklist
因为普通的链表需要的附加指针空间太大,会比较浪费空间。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9KF9XDWA-1659156278095)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220704103805871.png)]](/img/6c/820fdbe4343c16fa5d161e9be02b08.png)
集合set
redis的set对外提供的功能与list类似,也是一个列表的功能,特殊之处是在于set是可以去重的
是string的无序集合,底层是一个value的null的hash表,所以可以添加、删除、查找都是O(1)
常用命令:
- sadd key value1 value2…:讲一个或者多个member元素加到集合key中,已经存在的会被忽略
- smembers key:取出集合里的所有值
- sismember key value:判断集合key 是否含有该value值,1有0无
- scard key:返回该集合的元素个数
- srem key value1 value2…:删除集合中的某个元素
- spop key:随机从集合中吐出一个值
- srandmemeber key n :随机从该集合中取出n个值,不会从集合中删除
- smove source destination value:转移
- sinter key1 key2 :返回两个集合的交集元素
- sunion key1 key2:返回两个集合的并集元素
- sdiff key1 key2:返回两个集合的差集元素(key1中的不包含key2的)
数据结构:色同时dict字典,是用哈希表实现的,使用hash结果,所有的value指向同一个内部值
哈希hash
redis的hash是一个键值对集合,是一个string类型的filed和value的映射表,hash特别适合用于存储对象。

常用命令:
- hset key field value:给key集合中的field键赋值value
- hget key1 field :从集合key1的field中取出value
- hmset key1 field1 value1 filed2 value2>…:批量设置hash的值
- hexists key1 field :查看key中,给定域field是否存在
- hkeys key:列出该hash集合的所有field
- hvals key:列出该hash集合的所有value
- hincrby key field incrnment:为key中的filed的值加上1
- hsetnx key field value将key中的field得值设置为value,当且仅当field不存在
数据结构:两种:当field-value长度较短且个数较少时,shiyongziplist,否则使用hashtable
有序集合Zset
redis的Zset和普通的set很像,是一个没有重复元素的字符串集合
但有序集合的每个成员都关联了一个评分,这个评分被用来按照从低到高的方式排序集合中的成员。集合的成员是唯一的,但是评分是可以重复的
你可以根据评分或次序来获取一个范围的元素
常用命令:
zadd key score1 value score2 value…:将一个或者多个member元素及其评分加入到有序集合key中
zrange key startstop [withscores]:返回key中,下表载start-stop之间的元素;带withscores可以带评分一起返回
zrangebyscore key minmax [withscores] [limitoffset count]:返回key中所有score介于min和max之间的成员,按score值递增排序
zrevrangebyscore key maxmin [withscores] [limitoffset count]:返回key中所有score介于min和max之间的成员,递减排序
zincrby key increment value:为元素的score加上增量
zem key value:删除该集合下,指定值的元素
zcount key min max 统计该集合,分数区间内的元素个数
zrank key value 返回该值在集合中的排名,从0开】开始
可以利用Zset实现一个文章访问量的排行榜
数据结构:使用了两个数据结构:
- hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值
- 跳跃表,目的在于给元素value排序,根据score的范围获取元素列表
跳跃表
有序集合在生活中比较常见,例如会根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现么可以用数组、平衡树、链表等。数组不便于数据的插入、删除;平衡树或红黑树虽然效率高但是结构复杂;链表的查询需要遍历效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑偶数,但实现远比红黑树简单。
例如从链表中查询出51利用跳跃表,查找过程如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kfJ9lWR5-1659156278097)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220704160121110.png)]](/img/0b/5937c1784e32e896e4eeea12b9e8d4.png)
8、配置文件
redis端口6379被恶意攻击,导致xshell登录ssh验证失败或者持续等待问题一定要设置redis密码增强防护
另外,加强攻防措施还可以如下:
1、重置密码(最好没有规则)
附随机密码生成器:https://suijimimashengcheng.bmcx.com/
2、使用密钥+密码模式登录
3、设置redis密码
一、编辑redis.conf文件
建议在修改前备份一下redis.conf文件,这样即使操作出错了,也可以从头再来- 1.注释掉 bind 127.0.0.1
可以在 vim redis.conf 后进入指令模式(shift +:)
然后输入:/单词
快速找到单词的位置
- 1.注释掉 bind 127.0.0.1
- 2.修改protected-mode
在 redis.conf 中找到 protected-mode 将后面的 yes 改为 no
- 2.修改protected-mode
- 3.修改daemonize
在 redis.conf 中找到 daemonize 将后面的 no 改为 yes
- 3.修改daemonize
- 4.修改密码(requirepass foobared)
在 redis.conf 中找到 requirepass foobared ,可在下面添加 requirepass 你的密码
- 4.修改密码(requirepass foobared)
执行完以上操作后进入指令模式 wq 保存退出
二、重启redis
- 1.关闭redis
在 redis-cli 所在的目录下输入: redis-cli -a 密码
进入到 redis 指令模式,输入: shutdown
然后再输入: exit
- 1.关闭redis
- 2.启动redis
在 redis-server 所在的目录下输入: redis-server redis.conf所在目录/redis.conf
可以通过指令 ps aux | grep redis 查看redis状态
开放端口:
firewall-cmd --add-port=6379/tcp --permanent
重启防火墙生效
- 2.启动redis
!!!如果是在卡住进不去,可以在服务器控制台设置快照和镜像然后重装服务器系统(注意要提前备份好数据)
设置密码后要在代码里加上jedis.auth(“密码”)
9、发布和订阅
redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息
redis客户端可以订阅任意数量的频道

命令行实现:
1、打开一个客户端订阅channel1
SUBSCRIBE channel1

(打开的第一个客户端可以看到发布的消息)
2、打开另一个客户端,给channel1发布消息hello
publish channel1 hello

返回的是订阅者的数量
注:发布的消息没有持久化,如果在订阅的客户端收不到hello,只能收到订阅后发布的消息
10、新数据类型
1)Bitmaps
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6627SaoZ-1659156278100)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220704193849200.png)]](/img/78/50369cdb31873805b017d112e18a1e.png)
redis的Bitmaps就可以实现对位的操作:
- Bitmaps本身不是一种数据类型,实际上他就是字符串(key-value),但是他可以对字符串的位进行操作
- Bitmaps单独提供了一套指令,所以在redis中使用Bitmaps和使用字符串的方法不太一样。Bitmaps就像一个以位为单位的数组,数组的每个单元智能存储0和1,数组的下标在Bitmaps中叫做偏移量。

命令使用:
setbit key voffset alue:设置Bitmaps中某个偏移量的值(0或者1)//偏移量从0开始

注:很多应用的用户id以一个指定的数字(如1000)开头,直接将用户id和Bitmaps的偏移量对应势必会造成浪费,通常每次做setbit操作时将用户id减去这个指定数字
在第一次初始化BItmaps时,加入偏移量非常大,那么整个过程执行会比较慢,可能造成redis的阻塞。
getbit key offset:获取Bitmaps中某个偏移量的值

bitcount key [start end]:统计字符串中从start字节到end字节被设置为1的bit数量


bitop and(or/not/xor) destkey [key…]:复合操作,做多个Bitmaps的and(交集)、or(并集)、xor(异或集),并将结果保存到destkey中

Bitmaps与set对比:

2) HyperLogLog
一些统计问题,比如统计网站PV(pageView页面访问量),可以使用redis的incr、incrby轻松实现。
但是像UV(uniqueVisitor,独立访客)、独立Ip数、搜索记录数等需要去重和技术问题怎么解决?这种求集合中的不重复元素的个数的问题成为基数问题。
解决方法:
- 数据存储在mysql中,使用distinct count计算不重复个数
- 使用redis提供的hash、set、bitmaps等数据结构来处理
以上方法结构精确,但是随着数据量的不断增大,导致占用空间越来越大
降低一定的精度来平衡存储空间—>HyperLogLog:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的(12KB,可以计算接近2^64个不同元素的基数)
命令使用:
pfadd key element [element]:添加指定元素到HyperLogLog中

pfcount key [key…]:计算HLL的近似基数,可以计算多个key

pfmerge destkey sourcekey [sourcekey…]:将一个或者多个HLL合并后的结果存储在另一个HLL中

3) Geospatial
该类型,就是元素的二维坐标,在地图上就是经纬度,redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度hash等操作
命令使用:
geoadd key longitude latitude member [longitude latitude member…]:添加地理位置(经度纬度名称)

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ypFD61t9-1659156278111)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220704212143739.png)]](/img/55/ad03f31ad73facfdc71b646b284df5.png)
geopos key member [member…]:获取指定地区的坐标值

geodist key member1 member2 [m|km|ft|mi]:获取两个位置之间的直线距离


georadius key longitude latitude radius m|km|mi|ft :以给定的经纬度为中心,找出某一半径之内的元素

边栏推荐
猜你喜欢

tinymce 如何实现动态国际化

Forrester:行业云帮助中国企业更快适应未来的发展

365天挑战LeetCode1000题——Day 048 有序队列 脑筋急转弯

数据科学家 Agnis Liukis :在ML领域,初学者踩过的5个坑

CVPR 2022 | Predicting Skeletons from Human Meshes, True Physiological Skeletons!

PMP每日一练 | 考试不迷路-8.3(包含敏捷+多选)

Hanyuan Hi-Tech G8032 standard ERPS ring network switch Gigabit 4 optical 10 electrical industrial Ethernet switch ring network + WEB management + SNMP VLAN planning

MySQL数据表操作实战

项目管理:PMP和IPMP哪个更值得考?两个证书的区别在于哪里?
![[OpenCV] Cascade classifier training model](/img/37/ba57190d3515432700ec97ad14d0b9.png)
[OpenCV] Cascade classifier training model
随机推荐
使用Typora+EasyBlogImageForTypora写博客,无图床快速上传图片
苹果终于认清现实,销量成为优先考虑,iPhone14将不涨价
Golang 结构体&方法
Zhang Le: The Golden Triangle of R&D Efficiency and Practice in the Field of Demand and Agile Collaboration|Live Review
HCIP Fifteenth Day Notes (Three-layer Architecture of Enterprise Network, VLAN and VLAN Configuration)
Golang strings
PyTorch构建分类网络模型(Mnist数据集,全连接神经网络)
GBase 8c数据库集群中,怎么替换节点呢?比如设置A节点为gtm,换到B节点上。
node项目开发踩坑(一)
[微服务]多级缓存
数据分析(二)——numpy
An animation based button animation combined with basic code
Golang 接口 interface
鸿湖万联扬帆富设备开发板正式合入OpenHarmony主干
Golang 数组和切片
Golang dictionary map
Golang GMP principle
【二叉树】统计最高分的节点数目
secureCRT连接开发板连接不上问题解决
The embassy in Iceland reminds Chinese citizens in Iceland to strengthen safety protection