Redis缓存应用之Java

想必Redis这个缓存已经无人不知了,在代理的配合下已经在分布式缓存中的得到了很好的肯定,现在我们一起通过一个Java的例子全面了解Redis缓存。

首先需要安装redis,下载地址: https://github.com/MSOpenTech/redis

安装完后,在自己的安装目录 下进入cmd输入 redis-server --maxmemroy 200m ;之所以需要加这个指令“--maxmemroy
200m”,因为不少人会出现莫名的内存问题,正常打开后的界面是:

下面需要下载jar包:

现在开始写自己的代码:

代码第一部分:

<span style="font-size:18px;">package com.test.redis;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
import redis.clients.jedis.SortingParams;

public class RedisClient {

private Jedis jedis;<span style="color:#009900;">// 非切片额客户端连接</span>
private JedisPool jedisPool;<span style="color:#009900;">// 非切片连接池</span>
private ShardedJedis shardedJedis;<span style="color:#009900;">// 切片额客户端连接</span>
private ShardedJedisPool shardedJedisPool;<span style="color:#009900;">// 切片连接池</span>
<span style="color:#009900;">// 地址</span>
private static final String HOST = "127.0.0.1";
<span style="color:#009900;">// 端口</span>
private static final int PORT = 6379;

public RedisClient() {
initialPool();
initialShardedJedisPool();
<span style="color:#009900;">// 通过切片连接池实例一个客户端连接;</span>
shardedJedis = shardedJedisPool.getResource();
<span style="color:#009900;">// 通过非切片连接池实例一个客户端连接;</span>
jedis = jedisPool.getResource();
}

<span style="color:#6600cc;">/**
* 初始化非切片连接池
*/</span>
private void initialPool() {
<span style="color:#009900;">// 池水配置</span>
JedisPoolConfig config = new JedisPoolConfig();
<span style="color:#009900;">// 连接池在同一时刻内所提供的最大活动连接数。</span>
config.setMaxActive(20);
<span style="color:#009900;">// 连接池在空闲时刻保持的最大连接数.</span>
config.setMaxIdle(5);
<span style="color:#009900;">// 当发生异常时数据库等待的最大毫秒数 (当没有可用的连接时).</span>
config.setMaxWait(10001);
<span style="color:#009900;">// 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;</span>
config.setTestOnBorrow(false);
<span style="color:#009900;">// 构造池水</span>
jedisPool = new JedisPool(config, HOST, PORT);
}

<span style="color:#6600cc;">/**
* 初始化切片连接池
*/</span>
private void initialShardedJedisPool() {
<span style="color:#009900;">// 池基本配置</span>
JedisPoolConfig config = new JedisPoolConfig();
<span style="color:#009900;">// 连接池在同一时刻内所提供的最大活动连接数。</span>
config.setMaxActive(20);
<span style="color:#009900;">// 连接池在空闲时刻保持的最大连接数.</span>
config.setMaxIdle(5);
<span style="color:#009900;">// 当发生异常时数据库等待的最大毫秒数 (当没有可用的连接时).</span>
config.setMaxWait(1000l);
<span style="color:#009900;">// 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;</span>
config.setTestOnBorrow(false);
<span style="color:#009900;">// slave链接</span>
List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
shards.add(new JedisShardInfo(HOST, PORT, "master"));
<span style="color:#009900;">// 构造池</span>
shardedJedisPool = new ShardedJedisPool(config, shards);
}

public void show() {
KeyOperate();
StringOperate();
ListOperate();
SetOperate();
SortedSetOperate();
HashOperate();
jedisPool.returnResource(jedis);
shardedJedisPool.returnResource(shardedJedis);
}</span>

第二部分:测试类

<span style="font-size:18px;">package com.test.redis;

public class Main {

	public static void main(String[] args) {

		new RedisClient().show();

	}

}</span>

关于key的操作以及解释

      <span style="color:#6600cc;">   /**
	 * Key操作
	 */
	@Test</span>
	private void KeyOperate() {
		System.out.println("====key===");
		<span style="color:#009900;">/**
		 * exists(key):确认一个key是否存在
		 * del(key):删除一个key
		 * type(key):返回值的类型
		 * keys(pattern):返回满足给定pattern的所有key
		 * randomkey:随机返回key空间的一个
		 * keyrename(oldname, newname):重命名key
		 * dbsize:返回当前数据库中key的数目
		 * expire:设定一个key的活动时间(s)
		 * ttl:获得一个key的活动时间
		 * select(index):按索引查询
		 * move(key, dbindex):移动当前数据库中的key到dbindex数据库
		 * flushdb:删除当前选择数据库中的所有key
		 * flushall:删除所有数据库中的所有key
		 */</span>
		System.out.println("removeAll data :" + jedis.flushDB());
		<span style="color:#009900;">// 判断是否该key存在</span>
		System.out.println("check 'key999' exists or not " + shardedJedis.exists("key999"));
		System.out.println("add new key001,value001 " + shardedJedis.set("key001", "key001"));
		System.out.println("判断key001是否存在:" + shardedJedis.exists("key001"));
		<span style="color:#009900;">// 输出系统中所有的key</span>
		System.out.println("新增key002,value002键值对:" + shardedJedis.set("key002", "value002"));
		System.out.println("系统中所有键如下:");
		Set<String> keys = jedis.keys("*");
		Iterator<String> it = keys.iterator();
		while (it.hasNext()) {
			String key = it.next();
			System.out.println(key);
		}
		<span style="color:#009900;">// 删除某个key,若key不存在,则忽略该命令。</span>
		System.out.println("系统中删除key002: " + jedis.del("key002"));
		System.out.println("判断key002是否存在:" + shardedJedis.exists("key002"));
		<span style="color:#009900;">// 设置Key001过期时间</span>
		System.out.println("设置 key001的过期时间为5秒:" + jedis.expire("key001", 5));
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {

		}
		<span style="color:#009900;">// 查看某个key的剩余生存时间,单位秒,永久生存或不存在都是返回-1;</span>
		System.out.println("查看key001的剩余生存时间" + jedis.ttl("key001"));
		<span style="color:#009900;">// 移除某个key的生存时间</span>
		System.out.println("移除key001的生存时间" + jedis.persist("key001"));
		<span style="color:#009900;">// 查看key所储存的值的类型</span>
		System.out.println("查看key所储存的值的类型:" + jedis.type("key001"));

	}

运行结果:

关于String的操作以及解释

	<span style="color:#3333ff;">/**
	 * String功能
	 */</span>
	private void StringOperate() {
		System.out.println();
		System.out.println("====String的功能===");
<span style="color:#009900;">		/**
		 * set(key, value):给数据库中名称为key的string赋予值value
		 * get(key):返回数据库中名称为key的string的value
		 * getset(key, value):给名称为key的string赋予上一次的value
		 * mget(key1, key2,…, key N):返回库中多个string的value
		 * setnx(key, value):添加string,名称为key,值为value
		 * setex(key, time, value):向库中添加string,设定过期时间time
		 * mset(key N, value N):批量设置多个string的值
		 * msetnx(key N, value N):如果所有名称为key i的string都不存在
		 * incr(key):名称为key的string增1操作
		 * incrby(key, integer):名称为key的string增加integer
		 * decr(key):名称为key的string减1操作
		 * decrby(key, integer):名称为key的string减少integer
		 * append(key, value):名称为key的string的值附加value
		 * substr(key, start, end):返回名称为key的string的value的子串
		 */</span>
		System.out.println("removeAll data :" + jedis.flushDB());
		System.out.println("===========增加数据===========");
		<span style="color:#009900;">// redis缓存增加都使用set,获取都是get</span>
		jedis.set("key001", "value001");
		jedis.set("key002", "value002");
		jedis.set("key003", "value003");
		System.out.println("已新增的3个键值对如下:");
		System.out.println(jedis.get("key001"));
		System.out.println(jedis.get("key002"));
		System.out.println(jedis.get("key003"));
		System.out.println("============删除数据===========");
		System.out.println("删除key003键值对:" + jedis.del("key003"));
		System.out.println("获取key003键值对:" + jedis.get("key003"));
		System.out.println("============修改数据===========");
		<span style="color:#009900;">// 1、直接覆盖原来的数据</span>
		System.out.println("直接覆盖key001原来的数据:" + jedis.set("key001", "value001-update"));
		System.out.println("获取key001对应的新值:" + jedis.get("key001"));
		<span style="color:#009900;">// 2、追加原来的数据</span>
		System.out.println("【 在key002原来值后面追加:" + jedis.append("key002", "+appendString"));
		System.out.println("【 获取key002对应的新值" + jedis.get("key002"));
		System.out.println("=============增,删,查(多个)=============");
	<span style="color:#009900;">	/**
		 * mset,mget同时新增,修改,查询多个键值对Mutiple批量操作
		 * 等价于:
		 * jedis.set("name","ssss");
		 * jedis.set("jarorwar","xxxx");
		 */</span>
		System.out.println("一次性新增key201,key202,key203,key204及其对应值:"
				+ jedis.mset("key201", "value201", "key202", "value202", "key203", "value203", "key204", "value204"));
		System.out.println("一次性获取key201,key202,key203,key204各自对应的值:" + jedis.mget("key201", "key202", "key203", "key204"));
		System.out.println("一次性删除key201,key202:" + jedis.del(new String[] { "key201", "key202" }));
		System.out.println("一次性获取key201,key202,key203,key204各自对应的值:" + jedis.mget("key201", "key202", "key203", "key204"));
		System.out.println();

	}

运行结果:

关于List的操作以及解释

       <span style="color:#6600cc;">  /**
	 * List操作
	 */</span>
	private void ListOperate() {
		System.out.println();
		System.out.println("======================list==========================");
		<span style="color:#009900;">// 清空数据</span>
		System.out.println("清空库中所有数据:" + jedis.flushDB());
		System.out.println("===========增加元素===========");
		<span style="color:#009900;">/*
		 * key指的是list的名称,这里的list类似与栈的结构,所以先lpush进去的话,实际下标是最后那个
		 * rpush(key, value):在名称为key的list尾添加一个值为value的元素
		 * lpush(key, value):在名称为key的list头添加一个值为value的 元素
		 * lrange(key, start, end):返回名称为key的list中start至end之间的元素
		 * ltrim(key, start, end):删除start-end以外的元素
		 * lset(key, index, value):给名称为key的list中index位置的元素赋值
		 * lrem(key, count, value):删除count个key的list中值为value的元素,可以直接根据value删除
		 * lpop(key):返回并删除名称为key的list中的首元素
		 * rpop(key):返回并删除名称为key的list中的尾元素
		 * llen(key):返回list'的长度
		 * sort(key):list进行排序
		 */</span>
		shardedJedis.lpush("stringlists", "vector");
		shardedJedis.lpush("stringlists", "ArrayList");
		shardedJedis.lpush("stringlists", "vector");
		shardedJedis.lpush("stringlists", "vector");
		shardedJedis.lpush("stringlists", "LinkedList");
		shardedJedis.lpush("stringlists", "MapList");
		shardedJedis.lpush("stringlists", "SerialList");
		shardedJedis.lpush("stringlists", "HashList");
		shardedJedis.lpush("numberlists", "3");
		shardedJedis.lpush("numberlists", "1");
		shardedJedis.lpush("numberlists", "5");
		shardedJedis.lpush("numberlists", "2");
		System.out.println("所有元素-stringlists:" + shardedJedis.lrange("stringlists", 0, -1));
		System.out.println("所有元素-numberlists:" + shardedJedis.lrange("numberlists", 0, -1));
		System.out.println("=============删除元素===========");
		<span style="color:#009900;">// 删除列表指定的值 ,第二个参数为删除的个数(有重复时),后add进去的值先被删,类似于出栈</span>
		System.out.println("成功删除指定元素个数-stringlists:" + shardedJedis.lrem("stringlists", 2, "vector"));
		<span style="color:#009900;">// 删除后的结果</span>
		System.out.println("删除指定元素之后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1));
		<span style="color:#009900;">// 删除区间以外的数据</span>
		System.out.println("[ 删除下标0-3区间之外的元素:" + shardedJedis.ltrim("stringlists", 0, 3));
		System.out.println("[ 删除指定区间之外元素后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1));
		<span style="color:#009900;">// 列表元素出栈</span>
		System.out.println("出栈元素:" + shardedJedis.lpop("stringlists"));
		System.out.println("元素出栈后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1));
		System.out.println("=============改=============");
		<span style="color:#009900;">// 修改列表中指定下标的值</span>
		shardedJedis.lset("stringlists", 0, "hello list!");
		System.out.println("下标为0的值修改后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1));
		System.out.println("=============查=============");
		<span style="color:#009900;">// 数组长度</span>
		System.out.println("长度-stringlists:" + shardedJedis.llen("stringlists"));
		System.out.println("长度-numberlists:" + shardedJedis.llen("numberlists"));

		<span style="color:#009900;">// 排序
		/*
		 * list中存字符串时必须指定参数为alpha,如果不使用SortingParams,而是直接使用sort("list"),
		 * 会出现"ERR One or more scores can't be converted into double"
		 */</span>
		SortingParams sortingParameters = new SortingParams();
		sortingParameters.alpha();
		sortingParameters.limit(0, 3);
		System.out.println("返回排序后的结果-stringlists:" + shardedJedis.sort("stringlists", sortingParameters));
		//
		System.out.println("返回排序后的结果-numberlists:" + shardedJedis.sort("numberlists"));
		<span style="color:#009900;">// 子串: start为元素下标,end也为元素下标;-1代表倒数一个元素,-2代表倒数第二个元素</span>
		System.out.println("子串-第二个开始到结束:" + shardedJedis.lrange("stringlists", 1, -1));
		<span style="color:#009900;">// 获取列表指定下标的值</span>
		System.out.println("获取下标为2的元素:" + shardedJedis.lindex("stringlists", 2) + "\n");
	}

运行结果

关于Set的操作以及解释

       <span style="color:#6600cc;">  /**
	 * set操作
	 */</span>
	private void SetOperate() {
		System.out.println();
		System.out.println("======================set==========================");
		<span style="color:#009900;">// 清空数据</span>
		System.out.println("清空库中所有数据:" + jedis.flushDB());
		<span style="color:#009900;">/**
		 * sadd(key, member):向名称为key的set中添加元素member
		 * srem(key, member) :删除名称为key的set中的元素member
		 * spop(key) :随机返回并删除名称为key的set中一个元素
		 * smove(srckey, dstkey, member) :移到集合元素
		 * scard(key) :返回名称为key的set的基数
		 * sismember(key, member) :member是否是名称为key的set的元素,
		 * sinter(key1, key2,…key N) :求交集
		 * sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
		 * sunion(key1, (keys)) :求并集
		 * sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
		 * sdiff(key1, (keys)) :求差集
		 * sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
		 * smembers(key) :返回名称为key的set的所有元素,返回一个set
		 * srandmember(key) :随机返回名称为key的set的一个元素
		 */</span>
		System.out.println("=============增=============");
		System.out.println("向sets集合中加入元素element001:" + jedis.sadd("sets", "element001"));
		System.out.println("向sets集合中加入元素element002:" + jedis.sadd("sets", "element002"));
		System.out.println("向sets集合中加入元素element003:" + jedis.sadd("sets", "element003"));
		System.out.println("查看sets集合中的所有元素:" + jedis.smembers("sets"));
		System.out.println("=============删=============");
		System.out.println("集合sets中删除元素element003:" + jedis.srem("sets", "element003"));
		System.out.println("查看sets集合中的所有元素:" + jedis.smembers("sets"));
		<span style="color:#009900;">/*
		 * System.out.println("sets集合中任意位置的元素出栈:"+jedis.spop("sets"));//注:出栈元素位置居然不定?--无实际意义
		 * System.out.println("查看sets集合中的所有元素:"+jedis.smembers("sets"));
		 */</span>
		System.out.println("=============查=============");
		System.out.println("【 判断element001是否在集合sets中:" + jedis.sismember("sets", "element001"));
		System.out.println("循环查询获取sets中的每个元素:");
		Set<String> set = jedis.smembers("sets");
		Iterator<String> it = set.iterator();
		while (it.hasNext()) {
			Object obj = it.next();
			System.out.println(obj);
		}
		System.out.println();

		System.out.println("=============集合运算=============");
		System.out.println("sets1中添加元素element001:" + jedis.sadd("sets1", "element001"));
		System.out.println("sets1中添加元素element002:" + jedis.sadd("sets1", "element002"));
		System.out.println("sets1中添加元素element003:" + jedis.sadd("sets1", "element003"));
		System.out.println("sets1中添加元素element002:" + jedis.sadd("sets2", "element002"));
		System.out.println("sets1中添加元素element003:" + jedis.sadd("sets2", "element003"));
		System.out.println("sets1中添加元素element004:" + jedis.sadd("sets2", "element004"));
		System.out.println("查看sets1集合中的所有元素:" + jedis.smembers("sets1"));
		System.out.println("查看sets2集合中的所有元素:" + jedis.smembers("sets2"));
		System.out.println("sets1和sets2交集:" + jedis.sinter("sets1", "sets2"));
		System.out.println("sets1和sets2并集:" + jedis.sunion("sets1", "sets2"));
		System.out.println("sets1和sets2差集:" + jedis.sdiff("sets1", "sets2"));<span style="color:#009900;">// 差集:set1中有,set2中没有的元素</span>

	}

运行结果

关于ZSet的操作以及解释

        <span style="color:#6600cc;"> /**
	 * 有序Set
	 */</span>
	private void SortedSetOperate() {
		System.out.println("======================zset==========================");
		<span style="color:#009900;">// 清空数据</span>
		System.out.println(jedis.flushDB());
		<span style="color:#009900;">/**
		 * zadd.(key,score,value);增加等于该key的set得分等于score的元素value
		 * zrem(key,value);删除等于该key的set中value该元素
		 * zrange(key,start,end);返回等于该key的set中下标等于start-end之间的所有元素;
		 * zcard(key);返回等于该key的set的集合长度;
		 * zscore(key);查看等于该key的set集合中value元素的权重
		 */</span>
		System.out.println("=============增=============");
		System.out.println("zset中添加元素element001:" + shardedJedis.zadd("zset", 7.0, "element001"));
		System.out.println("zset中添加元素element002:" + shardedJedis.zadd("zset", 8.0, "element002"));
		System.out.println("zset中添加元素element003:" + shardedJedis.zadd("zset", 2.0, "element003"));
		System.out.println("zset中添加元素element004:" + shardedJedis.zadd("zset", 3.0, "element004"));
		System.out.println("zset集合中的所有元素:" + shardedJedis.zrange("zset", 0, -1));// 按照权重值排序
		System.out.println();

		System.out.println("=============删=============");
		System.out.println("zset中删除元素element002:" + shardedJedis.zrem("zset", "element002"));
		System.out.println("zset集合中的所有元素:" + shardedJedis.zrange("zset", 0, -1));
		System.out.println();
		System.out.println("=============查=============");
		System.out.println("统计zset集合中的元素中个数:" + shardedJedis.zcard("zset"));
		System.out.println("统计zset集合中权重某个范围内(1.0——5.0),元素的个数:" + shardedJedis.zcount("zset", 1.0, 5.0));
		System.out.println("查看zset集合中element004的权重:" + shardedJedis.zscore("zset", "element004"));
		System.out.println("查看下标1到2范围内的元素值:" + shardedJedis.zrange("zset", 1, 2));
	}

运行结果

关于Hash的操作以及解释

     <span style="color:#6600cc;">    /**
	 * Hash操作
	 */</span>
	private void HashOperate() {
		System.out.println("======================hash==========================");
		<span style="color:#009900;">// 清空数据</span>
		System.out.println(jedis.flushDB());
		<span style="color:#009900;">/**
		 * hset(key, field, value):向名称为key的hash中添加元素field<—>value
		 * hget(key, field):返回名称为key的hash中field对应的value
		 * hmget(key, field1, …,field N):返回名称为key的hash中field i对应的value
		 * hmset(key, field1, value1,…,field N, value N):向名称为key的hash中添加元素field i<—>value i
		 * hincrby(key, field, integer):将名称为key的hash中field的value增加integer
		 * hexists(key, field):名称为key的hash中是否存在键为field的域
		 * hdel(key, field):删除名称为key的hash中键为field的域
		 * hlen(key):返回名称为key的hash中元素个数
		 * hkeys(key):返回名称为key的hash中所有键
		 * hvals(key):返回名称为key的hash中所有键对应的value
		 * hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
		 */</span>
		System.out.println("=============增=============");
		System.out.println("hashs中添加key001和value001键值对:" + shardedJedis.hset("hashs", "key001", "value001"));
		System.out.println("hashs中添加key002和value002键值对:" + shardedJedis.hset("hashs", "key002", "value002"));
		System.out.println("hashs中添加key003和value003键值对:" + shardedJedis.hset("hashs", "key003", "value003"));
		System.out.println("新增key004和4的整型键值对:" + shardedJedis.hincrBy("hashs", "key004", 4l));
		System.out.println("hashs中的所有值:" + shardedJedis.hvals("hashs"));
		System.out.println();

		System.out.println("=============删=============");
		System.out.println("hashs中删除key002键值对:" + shardedJedis.hdel("hashs", "key002"));
		System.out.println("hashs中的所有值:" + shardedJedis.hvals("hashs"));
		System.out.println();

		System.out.println("=============改=============");
		System.out.println("key004整型键值的值增加100:" + shardedJedis.hincrBy("hashs", "key004", 100l));
		System.out.println("hashs中的所有值:" + shardedJedis.hvals("hashs"));
		System.out.println();

		System.out.println("=============查=============");
		System.out.println("判断key003是否存在:" + shardedJedis.hexists("hashs", "key003"));
		System.out.println("获取key004对应的值:" + shardedJedis.hget("hashs", "key004"));
		System.out.println("批量获取key001和key003对应的值:" + shardedJedis.hmget("hashs", "key001", "key003"));
		System.out.println("获取hashs中所有的key:" + shardedJedis.hkeys("hashs"));
		System.out.println("获取hashs中所有的value:" + shardedJedis.hvals("hashs"));
		System.out.println();

	}

运行结果

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 17:50:01

Redis缓存应用之Java的相关文章

Java 使用Redis缓存工具的图文详细方法

开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java. (1)Java的安装配置可以参考我们的 Java开发环境配置 (2)安装了 redis 服务: 请参考:Windows环境下使用Redis缓存工具的图文详细方法 或是: 首先你需要下载驱动包,下载 jedis.jar,确保下载最新驱动包. 在你的classpath中包含该驱动包. 一.新建一个javaweb项目. 1. 新建一个Jedis的项目.

为什么要用缓存服务器以及在 Java 中实现一个 redis 缓存服务

缓存服务的意义 为什么要使用缓存?说到底是为了提高系统的运行速度.将用户频繁访问的内容存放在离用户最近,访问速度最快的地方,提高用户的响应速度.一个 web 应用的简单结构如下图. web 应用典型架构 在这个结构中,用户的请求通过用户层来到业务层,业务层在从数据层获取数据,返回给用户层.在用户量小,数据量不太大的情况下,这个系统运行得很顺畅.但是随着用户量越来越大,数据库中的数据越来越多,系统的用户响应速度就越来越慢.系统的瓶颈一般都在数据库访问上.这个时候可能会将上面的架构改成下面的来缓解数

java本地缓存和redis缓存

  本地缓存 本地缓存存储在内存当中,实现缓存如下 首先需要引入包 <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.1</version> </dependency> 缓存服务接口: package com.mobcb.platform.service.common; im

因在缓存对象中增加字段,而导致Redis中取出缓存转化成Java对象时出现反序列化失败的问题

背景描述 因为业务需求的需要,我们需要在原来项目中的一个DTO类中新增两个字段(我们项目使用的是dubbo架构,这个DTO在A项目/服务的domain包中,会被其他的项目如B.C.D引用到).但是这个DTO对象已经在Redis缓存中存在了,如果我们直接向类中增加字段而不做任何处理的话,那么查询操作查出来的缓存对象就会报反序列化失败的错误,从而影响正常的业务流程,那么来看一下我的解决方案吧. 升级缓存版本号 我们的正式环境和预发布环境是共用Redis和Mysql.如果修改了DTO且没有加@Json

springboot redis 缓存对象

只要加入spring-boot-starter-data-redis , springboot 会自动识别并使用redis作为缓存容器,使用方式如下 gradle加入依赖 compile("org.springframework.boot:spring-boot-starter-data-redis:${springBootVersion}") redis configuration 中启用缓存 @Configuration @EnableCaching public class Re

使用redis缓存加索引处理数据库百万级并发

使用redis缓存加索引处理数据库百万级并发 前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想.准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1000万条数据,可以参考我之前的文章插入数据,这里不再细说.我大概的做法是这样的,编码使用多线程访问我的数据库,在访问数据库前先访问redis缓存没有的话在去查询数据库,需要注意的是redis最大连接数最好设置为300,不然会出现很多报错. 贴一下代码吧 1 2 3 4 5 6 7 8 9 10 1

Windows环境下使用Redis缓存工具的图文详细方法

网上找了两篇关于Redis的博客,记录下! Java 使用Redis缓存工具的图文详细方法 Windows环境下使用Redis缓存工具的图文详细方法

Redis 缓存 + Spring 的集成示例(转载)

1. 依赖包安装 pom.xml 加入: <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.6.0.RELEASE</version> </dependency> <dependency> <groupId>redis

Linux之搭建redis缓存服务器

Linux之搭建redis缓存服务器(nginx+tomcat+redis+mysql实现session会话共享) 一.redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写