码迷,mamicode.com
首页 > 编程语言 > 详细

Redis缓存应用之Java

时间:2015-08-06 18:28:54      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:缓存

想必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();

	}


运行结果

技术分享

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

Redis缓存应用之Java

标签:缓存

原文地址:http://blog.csdn.net/barnetthe/article/details/47318763

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!