字符串是 Redis 最基本的数据结构,它将以一个键和一个值存储于 Redis 内部,它犹如 Java 的 Map 结构,让 Redis 通过键去找到值。Redis 字符串的数据结构如下图所示。

Redis 会通过 key 去找到对应的字符串,比如通过 key1 找到 value1,又如在 Java 互联网中,假设产品的编号为 0001,只要设置 key 为 product_0001,就可以通过 product_0001 去保存该产品到 Redis 中,也可以通过 product_0001 从 redis 中找到产品信息。

字符串的一些基本命令。

我们看到了字符串的常用操作,为了在 Spring 中测试这些命令,首先配置 Spring 关于 Redis 字符串的运行环境,配置 Spring 关于 Redis 字符串的运行环境代码如下所示。

<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"><property name="maxIdle" value="50" /><property name="maxTotal" value="100" /><property name="maxWaitMillis" value="20000" />
</bean><bean id="connectionFactory"class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><property name="hostName" value="localhost" /><property name="port" value="6379" /><property name="poolConfig" ref="poolConfig" />
</bean>
<bean id="jdkSerializationRedisSerializer"class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
<bean id="stringRedisSerializer"class="org.springframework.data.redis.serializer.StringRedisSerializer" />
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"><property name="connectionFactory" ref="connectionFactory" /><property name="keySerializer" ref="stringRedisSerializer" /><property name="valueSerializer" ref="jdkSerializationRedisSerializer" />
</bean>

注意:这里给 Spring 的 RedisTemplate 的键值序列化器设置为了 String 类型,所以它就是一种字符串的操作。假设把这段 Spring 的配置代码保存为一个独立为文件 applicationContext.xml,使用 Spring 测试 Redis 字符串操作代码如下所示。

package com.test;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.RedisTemplate;import com.pojo.Role;public class Test {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class);// 设值redisTemplate.opsForValue().set("key1", "value1");redisTemplate.opsForValue().set("key2", "value2");// 通过key获取值String value1 = (String) redisTemplate.opsForValue().get("key1");System.out.println(value1);// 通过key删除值redisTemplate.delete("key1");// 求长度Long length = redisTemplate.opsForValue().size("key2");System.out.println(length);// 设值新值并返回旧值String oldValue2 = (String) redisTemplate.opsForValue().getAndSet("key2", "new_value2");System.out.println(oldValue2);// 通过key获取值.String value2 = (String) redisTemplate.opsForValue().get("key2");System.out.println(value2);// 求子串String rangeValue2 = redisTemplate.opsForValue().get("key2", 0, 3);System.out.println(rangeValue2);// 追加字符串到末尾,返回新串长度int newLen = redisTemplate.opsForValue().append("key2", "_app");System.out.println(newLen);String appendValue2 = (String) redisTemplate.opsForValue().get("key2");System.out.println(appendValue2);}
}

这是主要的目的只是在 Spring 操作 Redis 键值对。

在 Spring 中,redisTemplate.opsForValue() 所返回的对象可以操作简单的键值对,可以是字符串,也可以是对象,具体依据你所配置的序列化方案。

由于配置 Spring 关于 Redis 字符串的运行环境代码所配置的是字符串,所以以字符串来操作 Redis。

上面介绍了字符串最常用的命令,但是 Redis 除了这些之外还提供了对整数和浮点型数字的功能。如果字符串是数字(整数或者浮点数),那么 Redis 还能支持简单的运算。不过它的运算能力比较弱,目前版本只能支持简单的加减法运算。

Redis支持的简单运算

由于 Redis 的功能比较弱,所以经常会在 Java 程序中读取它们,然后通过 Java 进行计算并设置它们的值。

使用 JDK 序列化器,那么 Redis 保存的将不会是数字而是产生异常,字符是 Redis 最基本的类型,它可以使用最多的命令。测试代码如下所示。

/**
*测试Redis运算.
*/
public static void testCal() {ApplicationContext applicationContext =new ClassPathXmlApplicationContext("applicationContext.xml");RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class);redisTemplate.opsForValue().set ("i", "9");printCurrValue(redisTemplate, "i");redisTemplate.opsForValue().increment("i", 1);printCurrValue(redisTemplate,"i");redisTemplate.getConnectionFactory().getConnection().decrBy(redisTemplate.getKeySerializer().serialize("i"));printCurrValue(redisTemplate, "i");redisTemplate.getConnectionFactory().getConnection().decrBy(redisTemplate.getKeySerializer() .serialize("i"), 6);printCurrValue(redisTemplate, "i");redisTemplate.opsForValue().increment("i", 2.3);printCurrValue (redisTemplate, "i");
}/**
*打印当前key的值
*@param redisTemplate spring RedisTemplate
*@param key 键
*/
public static void printCurrValue(RedisTemplate redisTemplate, String key) {String i = (String) redisTemplate.opsForValue().get(key);System.err.println(i);
}

注意:Spring 已经优化了代码,所以加粗的 increment 方法可以支持长整形(long)和双精度(double)的加法,而对于减法而言,RedisTemplate 并没有进行支持,所以用下面的代码去代替它:

redisTemplate.getConnectionFactory().getConnection().decrBy(redisTemplate.getKeySerializer().serialize("i"),6);

通过获得连接工厂再获得连接从而得到底层的 Redis 连接对象。为了和 RedisTemplate 的配置保持一致,所以先获取了其 keySerializer 属性,对键进行了序列化,如果获取结果也可以进行同样的转换。

当然 getConnection() 只是获取一个 spring data redis 项目中封装的底层对象 RedisConnection,甚至可以获取原始的链接对象—— Jedis 对象,比如下面这段代码:

Jedis jedis = (Jedis)redisTemplate.getConnectionFactory().getConnection().getNativeConnection();

首先,估计是因为 Redis 的版本在更替,支持的命令会有所不一,而 Spring 提供的 RedisTemplate 方法不足以支撑 Redis 的所有命令,所以这里才会有这样的变化。

而使用纯粹的 Java Redis 的最新 API 则可以看到这些命令对应的方法,这点是大家需要注意的。其次,所有关于减法的方法,原有值都必须是整数,否则就会引发异常,如下面这段代码,通过操作浮点数减法产生异常。

redisTemplate.opsForValue().set ("i", "8.9");
redisTemplate.getConnectionFactory().getConnection().decr(
redisTemplate.getKeySerializer().serialize("i"));

这些在 Java 中完全可以编译通过,但是运行之后产生了异常,这是因为对浮点数使用了 Redis 的命令,使用 Redis 的时候需要注意这些问题。

Redis字符串深入相关推荐

  1. Redis 字符串(String)

    Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME 实例 redis 127. ...

  2. redis 字符串数据(string)

    Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME 实例 redis 127. ...

  3. Redis学习---(7)Redis 字符串(String)

    Redis 字符串(String) Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_ ...

  4. bat获取命令返回值_全网都在找的redis字符串命令,总结在这了

    概述 redis一般用来做缓存,可能很多朋友都没有深入去学习redis的相关命令,只是涉及到安装部署而已,所以今天主要总结介绍一下redis字符串的一些命令. SET 语法:SET key value ...

  5. Redis源码-String:Redis String命令、Redis String存储原理、Redis String三种编码类型、Redis字符串SDS源码解析、Redis String应用场景

    Redis源码-String:Redis String命令.Redis String存储原理.Redis String三种编码类型.Redis字符串SDS源码解析.Redis String应用场景 R ...

  6. redis命令---redist键命令(key)---redis字符串命令(str)

    redis键的命令 序号 命令及描述 1 DEL key 该命令用于在 key 存在时删除 key. 2 DUMP key 序列化给定 key ,并返回被序列化的值. 3 EXISTS key 检查给 ...

  7. 【Redis系列2】Redis字符串对象之SDS(简单动态字符串)实现原理分析

    Redis字符串对象之SDS实现原理分析 前言 字符串对象 为什么Redis的字符串对象是二进制安全的 SDS空间分配策略 空间预分配 惰性空间释放 SDS和C语言字符串区别 SDS的底层存储对象 d ...

  8. string获取 倒数 下标_Redis系列:Redis字符串(STRING)介绍

    STRING APPEND 使用APPEND命令时,如果key已经存在,则会直接在value后追加值,如果key不存在,则会先创建一个value为空字符串的key,然后再追加: 127.0.0.1:6 ...

  9. Redis—字符串和SDS

    一.字符串 字符串的实现代码在sds.c和sds.h文件中. 1.1 字符串介绍 字符串是Redis中最为常见的数据存储类型,其底层实现是简单动态字符串sds(simple dynamic strin ...

最新文章

  1. 树莓派3b+目标检测: tflite 运行 mobilenet ssd
  2. 迪杰斯特拉算法(C语言实现)
  3. 【组队学习】【35期】数据可视化(Matplotlib)
  4. Response.getWriter() 和Response.getOutputStream冲突
  5. 一部手机失窃而揭露的黑色产业链
  6. Python中可以使用静态类变量吗?
  7. CVPR 2016 有什么值得关注的亮点?
  8. 嵌入式成长轨迹34 【嵌入式学习阶段】【ARM环境调试】【QT 移植环境及简单程序示例】---补充《ok6410 Qt移植百科全书》...
  9. 美团下一代服务治理系统 OCTO 2.0 的探索与实践
  10. word2vector数据集样式_这样做数据可视化驾驶舱,高端大气,一目了然,领导不点赞都难...
  11. python空行拼接字符串_在python中的每一个空行插入一个新的行字符串
  12. UIScrollView无法滚动
  13. python画图中grid等于true_python – 散布在GridPlot中覆盖多个绘图对象
  14. ssm上传文件获取路径_ssm框架实现图片上传显示并保存地址到数据库(示例代码)...
  15. [CIFS]解决linux挂载CIFS提示 HOST is down
  16. redis常见问题和解决方案
  17. 我的世界服务器无限矿区块指令,我的世界区块刷新指令 | 手游网游页游攻略大全...
  18. 使用google analytics(分析)监测百度竞价关键词效果(网址构建工具)
  19. 微信应用开发简单示例,学生自助报道系统
  20. 2021年广东省安全员A证第三批(主要负责人)考试内容及广东省安全员A证第三批(主要负责人)新版试题

热门文章

  1. laravel 异常捕获_Laravel框架捕获各种类型错误
  2. pythonrequests证书_python requests证书问题解决
  3. linux配置远程计算机别名没用,linux – `ssh foo“”`没有加载远程别名?
  4. 手机腾讯视频软件如何开启护眼功能
  5. 转码与重定向的区别之于SpringMVC
  6. vue-router进阶:路由使用归纳、路由导航守卫、导航守卫解析流程、
  7. 行内元素和块级元素的区别,为何img、input等行内元素可以设置宽高??(夯实基础)
  8. java实现两台计算机的互联,如何用Java语言实现两台计算机之间的文件传输?
  9. JVM中的五大内存区域划分详解
  10. c语言的表达式2 4 6 8的值,C语言程序设计测试题二