【Redis】数据范例:String

[复制链接]
发表于 2026-5-19 18:48:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

1.redis字符串(String)

String是Redis最根本的范例,一个key对应一个value。一个Redis中,字符串value最多可以是512M。
数据范例都是指 Value 的范例。
  1. ======= 🌟 青柠来相伴,代码更简单。🌟 =======<br>📚 本文所有内容,我都整理在了 青柠合集 里。👇<br>🎯 搜索关注【青柠代码录】,即可查看所有合集文章 ~<br>======= 🌟 =================== 🌟 =======<br>
复制代码
此中value是字符串,不外根据字符串的格式差别,又可以分为3类:

  • string:平常字符串
  • int:整数范例,可以做自增、自减操纵
  • float:浮点范例,可以做自增、自减操纵
imgstring范例是二进制安全的,意思是redis的string,可以包罗任何数据。
比如jpg图片、序列化的对象。不管是哪种格式,底层都是字节数组情势存储,只不外是编码方式差别。
Key结构

Redis没有类似MySQL中的Table的概念,我们该怎样区分差别范例的key呢?
比方,必要存储用户、商品信息到redis,有一个用户id是1,有一个商品id恰好也是1,此时假如使用id作为key,那就会辩说了,该怎么办?
我们可以通过给key添加前缀加以区分,不外这个前缀不是恣意加的,有肯定的规范:
Redis的key答应有多个单词,形成层级结构,多个单词之间用':'隔开,格式如下:项目名:业务名:范例:id。这个格式并非固定,也可以根据本身的需求,来删除或添加词条。
如许以来,我们就可以把差别范例的数据区分开了。从而制止了key的辩说标题。
比方:我们的项目名称叫 heima,有user和product两种差别范例的数据,我们可以如许界说key:

  • user干系的key:heima:user:1
  • product干系的key:heima:product:1
String结构是将对象,序列化为 JSON字符串 后存储
假如Value是一个Java对象,比方一个User对象,则可以将对象,序列化为JSON字符串后存储:
KEYVALUEheima:user:1{"id":1, "name": "Jack", "age": 21}heima:product:1{"id":1, "name": "小米11", "price": 4999}而且,在Redis的桌面客户端中,还会以雷同前缀作为层级结构,让数据看起来条理分明,关系清晰:
imgValue数据结构

String的数据结构为简朴动态字符串。是可以修改的字符串,内部结构实现上,类似于Java的ArrayList,接纳预分配冗余空间的方式,来淘汰内存的频仍分配.
img如图中所示,内部为当前字符串现实分配的空间capacity,一样平常要高于现实字符串长度len。
当字符串长度小于1M时,扩容都是更加现有的空间,假如凌驾1M,扩容时一次只会多扩1M的空间。
常见下令
  1. set <key><value>        添加键值对
  2. get   <key>                                查询对应键值
  3. mset  <key1><value1><key2><value2>          同时设置一个或多个key-value对  
  4. mget  <key1><key2><key3>         同时获取一个或多个value  
  5. <p>append  <key><value>        将给定的<value>追加到原值的末尾<br>
  6. strlen  <key>                        获得值的长度</p>
  7. <p>setnx  <key><value>                只有在key不存在时,设置key的值<br>
  8. msetnx <key1><value1><key2><value2>  同时设置一个或多个key-value对,当且仅当所有给定key都不存在。原子性,有一个失败则都失败</p>
  9. <p>setex  <key><过期时间><value>        设置键值的同时,设置过期时间,单位秒。</p>
  10. <p>incr  <key>                将key中储存的数字值增1,只能对数字值操作,如果为空,新增值为1<br>
  11. decr  <key>                将key中储存的数字值减1,只能对数字值操作,如果为空,新增值为-1<br>
  12. incrby / decrby  <key><步长>        将key中储存的数字值增减。自定义步长。</p>
  13. <p>INCRBYFLOAT:让一个浮点类型的数字自增并指定步长</p>
  14. <p>getrange  <key><起始位置><结束位置>                获得值的范围,类似java中的substring,前包,后包<br>
  15. setrange  <key><起始位置><value>        用<value>覆写<key>所储存的字符串值,从<起始位置>开始(索引从0开始)。</p>
  16. <p>getset <key><value>                以新换旧,设置了新值同时获得旧值。<br>
  17. </p>
复制代码
img

  • NX:当数据库中key不存在时,可以将key-value添加数据库
  • XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥
  • EX:key的超时秒数
  • PX:key的超时毫秒数,与EX互斥
incr的原子性
所谓原子操纵,是指不会被线程调理机制打断的操纵;
这种操纵一旦开始,就不停运行到竣事,中心不会有任何上下文切换(切换到另一个线程)。
① 在单线程中,可以大概在单条指令中完成的操纵,都可以以为是"原子操纵",由于克制只能发生于指令之间。
② 在多线程中,不能被别的历程(线程)打断的操纵就叫原子操纵。
Redis单下令的原子性,重要得益于Redis的单线程。
下令案例

1.最 常 用-set
img返回值:
设置乐成则返回OK,返回nil为未实行Set下令,如不满足NX,XX条件等。
若使用GET参数,则返回该键原来的值,或在键不存在时nil。
img怎样得到设置指定的key逾期的Unix时间,单位为秒
System.out.println(Long.toString(System.currentTimeMillis()/1000L));
img2.同时设置/获取多个键值-MSET
MSET key value [key value...]
MGET key [key ...]
mset/mget/msetnx
img3.获取指定区间范围内的值-setrange
getrange/setrange
img4.数值增减-INCR、DECR
肯定要是数据才华举行加减
递增数字:INCR key        增长指定的整数:INCRBY key increment
递减数值:DECR key        淘汰指定的整数:DECRBY key decrement
img5.获取字符串长度和内容追加-strlen、append
获取字符串长度:strlen key
字符串内容追加:append key value
img6.分布式锁-setnx、setex
setnx key value
setex(set with expire)键秒值/setnx(set if not exist)
img7.getset(先get再set)
getset:将给定key的值设为value,并返回key的旧值(old value)。
简朴一句话:先get然后立刻set
img
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表