【狂神说Redis】3五大数据类型
五大数据类型
官网文档
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件MQ。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
String
大多数java程序员使用的是String
- 常用命令
# group 1:增加,求长 append strlen
set name qd # set [key] [value]
append name 123 # append [key] [append_value] 追加字符串
strlen name # strlen [key] 判断key的字符串长度
append name2 zhangsan # append [key] [value] 如果没有当前key,就相当于set name2 zhangsan# group 2: 自增 自减 按照步长自增 按照步长自减 incr decr incrby decrby
set views 0 # set [key] [value]设置浏览量为0
incr views # incr [key] 给浏览量加一==》 1
decr views # decr [key] 给浏览量减一==》0,之后就不可以在自减了,会报error
incrby views 10 # incrby [key] [step] 自增步长:10
decrby views 10 # decrby [key] [step] 自减步长:10# group 3:字符串范围 getrange [startIndex] [endIndex] 一般情况下,两者都大于0,且endIndex>startIndex
getrange name 0 3 # getrange [key] [startIndex] [endIndex] 按照范围取字符串:index的值从0开始,会从star取到end 若按照正常的数值,取到的字符串长度为end-star+1
getrange name 0 -1 #getrange [key] [startIndex] -1 从starIndex取到最后#group 4:替换指定位置开始的字符串 setrange (相当于String中的replace)
setrange name 2 sub # setrange [key] [startIndex] [subString] 使用subString替代从statIndex开始的之后和subString相同长度的字符串;返回的为替代之后的长度
get name # 得到的为 lisubolu
# 示例2
setrange name 7 sub2
get name # 得到的为lisubolsub2# group 5: setex(作用同expire) setnx
#setex (set with expire) 设置过期时间
#setnex (set if not exit) 不存在则设置(在分布式锁常常使用)
setex name 30 "hello" # setex [key] [expireTime] [value] 设置key存活时长为expireTime,设置值为value (若key不存在则创建)
setnx key1 "qd" # setnx [key] [value] 当key不存在的时候设置值为value;存在会创建失败:(设置成功会返回1,设置失败会返回0)# group 6:批量设置mset mget msetex msetnx
mset k1 v1 k2 v2 k3 v3 # 批量设置(k1,v1),(k2,v2),(k3,v3) mset [key1] [value1] [key2] [value2] [key3] [value3] ... 存储的顺序是哈希算法设置的
mget k1 k2 # 批量获取 k1 k2... mget [key1] [key2] ...
msetnx k1 v1 k4 v4 # msetnx是一个原子性操作,要么一起成功,要么一起失败
# 进阶 使用对象
set user:1 {name:zhangsan,age:3} # 设置一个user:1对象 值为json字符串来保存一个对象
# 如何获取到单独的属性值????
mset user:1:name name1 user:1:age 2 # 批量设置对象属性 [object]:[id]:[field]
mget user:1:name user:1:age # 批量获取数据# group 7:getset 先get再set
getset db redis # 返回(nil) 获取的是db之前的值,如果之前没有设置,则返回(nil),之后获取的值为当前设置的值(redis)
get db # 本次返回的redis
- String类似的场景:value除了是字符串也可以是数字
- 应用:计数器 统计多单位的数量 粉丝数 对象缓存存储
- 扩展:CAS:比较并交换
JRedis:java操作的客户端,这些命令都会成为方法
结构是相同的
List
- 基本的数据类型
- 在redis中,可以将list玩成栈、队列、阻塞队列
- 大部分list命令都是由
l
开头:除了lpush和rpush表示左右,其他的l都表示list - 基础命令
# group 1 插入 lpush rpush
lpush list one # 将一个值或者多个值,插入到列表头部(从左端插入:头插)
lpush list two
lpush list three
lrange list 0 -1 # 获取list中的值:输出为 three two one (没有rrange)
lrange list 0 1 # 通过区间获取具体的值
rpush list four # 将一个值或者多个值,插入到列表尾部(从右端插入:尾插)
lrange list 0 -1 # 得到的结果为:three two one four# group 2 移除lpop rpop
lpop list # 向左移除一个元素,返回的是元素内容:three
rpop list # 向右移除一个元素,返回的是元素内容:four# group 3 按照索引取值
lindex list 0 # 索引从0开始,-1代表取最后一个元素 没有rindex# group 4 获取列表长度 llen
llen list # 返回列表长度# group 5 移除指定值 count>0 移除count个(从前往后) count=0 移除所有 count<0移除count个(从后往前)
lrem list 0 one # 移除list中所有的one
lrem list 1 one # 移除list中的一个one# group 6 截断操作
lpush list2 one two three four # 新的list:list2[one,two,three,four]
ltrim list2 1 2 # 截断:截断的时候两个参数是index(从0开始),会改变list# group 7 rpoplpush:移出列表的最后一个元素,并将它放到一个新list中 旧的list可以和新的list是同一个
lpush list3 one two three four # 新的list:list3[one,two,three,four]
rpoplpush list3 list4 # "one"
lrange list3 0 -1 # 得到的结果为: four three two
lrange list4 0 -1 # 得到的结果为:one# group 8 lset 给一个已经存在的list修改已经存在的index的值:相当于更新操作
lpush list5 one two three four # 新的list:list5[one,two,three,four]
exists list5 # 判断是否存在,返回0(不存在)或 1(存在)
lset list5 0 item # 将list5中的第0个元素设置为“item”,注意index的位置 # group 9 linsert 将某个具体的value插入到列表中某个元素的前面或后面
lpush list6 one one three four # 新的list:list6[one,one,three,four]
linsert list6 before one qd # 将qd插入到one前面:list6[qd,one,one,three,four]
linsert list6 after one qd2 # 将qd2插入到one后面:list6[qd,one,qd2,one,three,four]
# 如果有重复,会按照第一个为标准
小结:
- 实际上是一个链表,before node after,left,right都可以插入值
- 如果key不存在,则创建新的链表
- 如果key存在新增内容
- 如果移除了所有值,即空链表,也代表不存在
- 当在两边插入或者改动值的时候,效率最高;操作中间元素的时候相对效率会低一些
- 应用:消息排队,消息队列(lpush,rpop),栈(lpush,lpop)
Set 集合
- 无序不能重复值
- 基础命令
sadd set0 "one" "two" "three" "four" # set0集合中添加元素
smembers set0 # 查看set0的值
sismember set0 one # 判断set0中是否存在 one 元素
scard set0 #查看set0的元素个数
srem set0 one # 移除set0中的指定元素
srandmember set0 # 随机从set0中取元素,默认为取一个
srandmember set0 2 # 随机从set0中取两个元素
spop set0 # 随机移除set0中的一个元素;返回值为移除的值
spop set0 2 # 随机移除set0中的两个元素;返回值为移除的值sadd set1 "hello" "123" "qd" # 创建set1
sadd set2 "hello2" "1232" "qd2" # 创建set2
smove set1 set2 "hello" # 将set1中的"hello" 移动到set2# 差集sdiff 交集sunion 并集sinter
sadd key1 a b c # 创建key1
sadd key2 b c d # 创建key2
sdiff key1 key2 # 求key1与key2的差集
sinter key1 key2 # 求key1与key2的交集
sunion key1 key2 # 求key1与key2的并集
- 应用:微博,A用户将所有关注放在一个set中,将其粉丝放在一个集合中:可以求和其他用户的共同关注,共同爱好,二度好友(六度分割理论),推荐好友(六度分割理论)
Hash(哈希)
- 想成一个Map集合:key-value(map):此处的value是map的类型
- 基础命令
# group 1
hset myhash field1 lxl # 创建一个hash:myhash
hmset myhash field1 lxl field2 qd # 可以一次赋值多个(也可以用hset操作)
hget myhash field1 # 获取一个field的值
hmget myhash field1 field2 # 获取多个field的值
hgetall myhash # 获取全部的数据# group 2
hdel myhash field1 # 删除hash指定的field,也会删除对应的value
hlen myhash # 查看hash中有多少对键值对
hexists myhash field1 # 判断hash中是否有对应的field 返回1或者0# group 3 只获取key 只获取value
hkeys myhash # 获取所有的field
hvals myhash # 获取所有的value# group 4 hincrby hsetnx
hset myhash field3 5 # 给myhash设置一个field3 值为5
hincrby myhash field3 2 # 使得myhash中的field3自增2(不可以省略步长)
hincrby myhash field3 -2 # 使得myhash中的field3自减2(不可以省略步长,没有hdecrby方法)
hsetnx myhash field4 hello # 如果不存在,则创建,存在则创建失败
- 应用:
- hash存储一些变更的数据: name age …,尤其是用户信息之类的经常变动的信息
- hash更实用于对象的存储,String更适合字符串存储
hset user:1 name qd age 20 # 设置id为1的用户的name age
hget user:1 name # 获取user:1的name
hmset user:1 name age # 获取user:1的name age
Zset(有序集合)
- 在set的基础上增加了一个值:set k1 v1 zset k1 score1 v1
- 有序集合底层数据结构是跳跃链表(常见面试考点)
- 基础命令
# score是可以重复的,元素值不重复
zadd myset 1 one # 创建zset 添加一个值
zadd myset 2 two 3 three # 一次添加多个值# group 2 排序
zadd salary 2500 xiaohong
zadd salary 5000 zhangsan
zadd salary 500 qd
zrangebyscore salary -inf +inf # 显示所有用户,从小到大排序范围:[-inf,+inf] (前者<后者,不能相等),返回的值只有元素值,不带着score
# 使用zrevrangebyscore 可以实现从大到小排列,这时候传的值需要前者大于后者,同样不可以相等
zrangebyscore salary 500 5500
zrangebyscore salary -inf +inf withscores # 带着score# 移除
zrem salary xiaohong # 移除一个元素 xiaohong,同时移除score# 获取指定区间的成员数量
zcard salary # 获取有序集合元素中的个数
zcount salary 500 5500 # 统计薪资在[500,5500]的人数
- 应用:
- set排序 存储班级成绩表 工资表排序 排行榜
- 带权重进行判断
【狂神说Redis】3五大数据类型相关推荐
- NoSQL(1)之 Redis的五大数据类型使用方法的详细介绍
Redis的五大数据类型也称五大数据对象:了解过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject:这个对象系统包含了五大数据对 ...
- redis之五大数据类型
redis之五大数据类型 redis redis的两种链接方式 简单链接 1234 import redisconn = redis.Redis(host='10.0.0.200',port=6379 ...
- redis的zset的底层实现_Redis(三)--- Redis的五大数据类型的底层实现
1.简介 Redis的五大数据类型也称五大数据对象:前面介绍过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject:这个对象系统包 ...
- 解析Redis操作五大数据类型常用命令
摘要:分享经常用到一些命令和使用场景总结,以及对Redis中五大数据类型如何使用cmd命令行的形式进行操作的方法. 本文分享自华为云社区<Redis操作五大数据类型常用命令解析>,作者:灰 ...
- 配置文件存int类型_Redis详解(五)------ redis的五大数据类型实现原理
> 本系列教程持续更新,可以微信搜索「 IT可乐 」第一时间阅读.回复<电子书>有我为大家特别筛选的书籍资料 前面两篇博客,第一篇介绍了五大数据类型的基本用法,第二篇介绍了Redis ...
- Redis常用五大数据类型
1.String(字符串) string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 . string类型是Redis最基本的数据类型,一个red ...
- Redis的五大数据类型
1.String(字符串) String是Redis最基本的类型,一个Key对应一个Value. String类型是二进制安全的,意思是Redis的String可以包含任何数据,比如jpg图片或者序列 ...
- 学习了Redis的五大数据类型,其底层实现你了解吗?
文章目录 String底层 List底层 Hash底层 Set底层 Zset底层 String底层 String的底层并不是简单的C字符串简单动态字符串(Simple Dynamic String,S ...
- redis srandmember_Redis五大数据类型使用场景
Redis是一种基于键值对的NoSQL数据库,它的值主要由string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)五种基本数据结构构成,除此之外还支持一些其他的 ...
- 【Redis】Redis的五大数据类型
文章目录 字符串(strings) 散列(hashes) 列表(lists) 集合(sets) 有序集合(sorted sets) 字符串(strings) 开启redis服务并连接 [root@lo ...
最新文章
- 手动部署OpenStack环境(六:出现的问题与解决方案总结)
- 二叉排序树经典算法速成
- sklearn自学指南(part10)--Lasso及多任务Lasso
- 查看 固态硬盘位置_3米防摔+人脸/指纹解锁:西数Armorlock移动固态硬盘
- C++ 版本ORM访问数据库之ODB访问oracle的Demo(三)
- C#统计字符出现个数
- C++字符串空格替换题
- JSP + AjaxAnywhere页面开发规范
- SYNwall:零配置物联网防火墙
- 匹配 网络 Q值 带宽
- 基金定投matlab程序,销售基金定投好简单:如何三分钟让客户理智开户做定投
- MATLAB 詹姆斯韦伯天文望远镜轨迹 粗略效果仿真 (二)
- k3显示远程服务器未打开,k3客户端远程服务器链接
- E-CATT 录入测试数据的方法
- Logo(图片)作为报表水印的解决方法
- mysql 聚集索引 存什么_什么是mysql的聚集索引?
- 初次结识海蜘蛛(2)
- Java实现第九届蓝桥杯小朋友崇拜圈
- 制作epub格式电子书|用电脑看epub格式电子书的方法!
- Vue中 实现文件流格式图片预览
热门文章
- 基金境外设立子公司将迎新规 监管给出24个月过渡期
- 踩着七彩祥云来接你的人不一定是意中人,也可能是阿里云
- ZStack实践汇 | 快照和备份的区别
- 王庆的边缘计算(第三章)
- 【优化算法】蛙跳算法 (SFLA)【含Matlab源码 1839期】
- mysql悲观锁替代方案_MySQL中的悲观锁和乐观锁
- 苹果系统和安卓系统的区别_Android和iPhone的区别?还不如说安卓系统和IOS系统的差别...
- ai人工智能_AI破坏已经开始
- 计算机专业答辩网站怎么保证安全性,答辩(计算机专业答辩题目选集)
- 考上985能改变命运吗_南开研究生称读研改变命运被嘲讽,网友:本科垃圾,考上985也没用...