做推广的网站带宽需要多少钱,门户网站建设方法,wordpress安全插件对比,微信网页版本字符串是 Redis 最基本的数据结构#xff0c;它将以一个键和一个值存储于 Redis 内部#xff0c;它犹如 Java 的 Map 结构#xff0c;让 Redis 通过键去找到值。Redis 字符串的数据结构如下图所示。
Redis 会通过 key 去找到对应的字符串#xff0c;比如通过 key1 找到 v…字符串是 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 idpoolConfig classredis.clients.jedis.JedisPoolConfigproperty namemaxIdle value50 /property namemaxTotal value100 /property namemaxWaitMillis value20000 /
/beanbean idconnectionFactoryclassorg.springframework.data.redis.connection.jedis.JedisConnectionFactoryproperty namehostName valuelocalhost /property nameport value6379 /property namepoolConfig refpoolConfig /
/bean
bean idjdkSerializationRedisSerializerclassorg.springframework.data.redis.serializer.JdkSerializationRedisSerializer /
bean idstringRedisSerializerclassorg.springframework.data.redis.serializer.StringRedisSerializer /
bean idredisTemplate classorg.springframework.data.redis.core.RedisTemplateproperty nameconnectionFactory refconnectionFactory /property namekeySerializer refstringRedisSerializer /property namevalueSerializer refjdkSerializationRedisSerializer /
/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 的时候需要注意这些问题。