网站首页 > java教程 正文
纸上学来终觉浅,绝知此事要躬行!
字符串类型是Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习奠定基础。如图2-7所示,字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。
接下来我们按照三个部分介绍
- 内部编码
- 常用命令
- 典型使用场景
内部编码
就像Java中的HashMap是由数组+链表+红黑树的方式实现一样,字符串这种数据结构也有自己的底层的内部编码实现,而且不止一种。
对于字符串来说,它的内部编码实现有三种:
- int:8个字节的长整型;
- embstr:长度小指定字节数的字符串;
- raw:长度大于指定字节数的字符串;
Redis会根据当前设置的值得类型和长度,决定使用哪种内部编码,两种字符串的编码格式选择,在不同的redis版本中,略有差别,甚至在更早的版本里(比如2.8)是没有embstr编码类型的。
采用不同的内部编码的好处包括(1)改进内部编码时,对外部的数据结构和命令没有任何影响,就像刚说过的embstr编码类型的字符串一样;(2)多种不同的编码实现可以在不同的场景下发挥各自的优势。
在这里,我们简单介绍一下关于embstr和raw两种内部编码有什么区别,raw表示redis使用一个简单动态字符串(SDS)来保存这个字符串,它会调用两次内存分配函数来分别创建redisObject结构和sdshdr结构。而embstr是针对短字符串的一种优化的编码方式,它只会调用一次内存分配函数来分配一个连续的空间,空间中依次包含redisObject结构和sdshdr结构。
Redis中每个对象都由一个redisObject结构表示
typedef struct redisObject {
// 类型
unsigned type 4;
// 编码,比如embstr、raw
unsigned encoding 4;
// 指向底层实现数据结构的指针
void *ptr
// ......
} robj;
// 每个sdshdr结构表示一个SDS值
struct sdshdr {
// 记录buf中已使用的字节的数量,就是SDS保存的字符串的长度
int len;
// buf中未使用的字节的数量
int free;
// 保存字符串的字节数组
char buf[];
}
我这里使用的是3.2版本长度阈值是45
常用命令
比较常用命令,包括设置值、获取值、批量设置值、批量获取值、自增、自减等
(1)设置值
设置单个key的值:set key value [ex seconds] [px milliseconds] [nx|xx]
参数说明:[ex seconds]可选参数,秒级过期时间;[px milliseconds]可选参数毫秒级过期参数;[nx]可选限制参数,key必须不存在才可以设置成功,用于添加;[xx]可选限制参数,key必须存在才可以设置成功,用于更新
批量设置值:mset key1 value1 key2 value2......
(2)自增、自减
自增/自减1:incr/decr key
如果key不存在,则默认初始为0
自增/自减指定值:incrby/decrby key arg
指定增减arg值
(3)其他命令
删除:del key1 [key2......]
获取值长度:strlen key
追加内容:append key value
典型使用场景
(1)缓存场景
缓存是一个非常普遍的使用场景,redis作为缓存层,可以把热点数据放在redis里,减小存储层压力的同时增加访问速度,毕竟内存的的访问速度比磁盘的访问速度快的不是一点半点。
(2)计数
通过自增命令,可以实现快速计数、查询缓存的功能,并且数据可以异步落地到其他数据源。
(3)共享session
伴随着分布式web应用的普及,session共享应运而生,为了解决这个问题,可以使用redis管理用户的session信息,只需要保证redis的高可用和扩展性即可。
(4)限速
对于很多提供手机验证码登录的网站来说,会有被刷短信接口的风险,为了防止短信接口的频繁访问,会限制每个手机号每分钟获取验证码的频率,该功能即可用Redis来实现。
(5)分布式锁
关于分布式锁,请看我的另外一篇文章分布式锁,这篇文章可以帮到你
猜你喜欢
- 2024-11-10 Spring 基于 XML 的 IOC(spring xml map)
- 2024-11-10 阿里P7大神,Java学习之路-IO流与XML,超赞分享
- 2024-11-10 如何用Ajax解析json,XML数据格式
- 2024-11-10 Python和XML(python)
- 2024-11-10 Qt开发-流方法解析XML(qt读取文件流)
- 2024-11-10 Kettle(PDI)转换中输出之XML输出详解
- 2024-11-10 Java代码审计之不安全的Java代码(java安全点有哪些)
- 2024-11-10 spring boot Mybatis Mapper.xml使用总结
- 2024-11-10 Tomcat Server.xml配置详解(tomcat service配置)
- 2024-11-10 C# XmlDocument读取xml(c#xml读取和传递)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)