Redis Quick Start
2015-02-04 00:00
411 查看
摘要: Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案。
Redis从它的许多竞争继承来的三个主要特点:
Redis数据库完全在内存中,使用磁盘仅用于持久性。
相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。
Redis可以将数据复制到任意数量的从服务器。
Redis 优势
异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。
支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散...
Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案。
Redis从它的许多竞争继承来的三个主要特点:
Redis数据库完全在内存中,使用磁盘仅用于持久性。
相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。
Redis可以将数据复制到任意数量的从服务器。
Redis 优势
异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。
支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。
操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。
多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。
Redis Java连接操作
jedis 是 Redis 官方首选的 Java 客户端开发包
测试类
附:Jedis操作命令
一、常用数据类型简介:
redis常用五种数据类型:string,hash,list,set,zset(sorted set).
1.String类型
String是最简单的类型,一个key对应一个value
String类型的数据最大1G。
String类型的值可以被视作integer,从而可以让“INCR”命令族操作(incrby、decr、decrby),这种情况下,该integer的值限制在64位有符号数。
在list、set和zset中包含的独立的元素类型都是Redis String类型。
2.List类型
链表类型,主要功能是push、pop、获取一个范围的所有值等。其中的key可以理解为链表的名字。
在Redis中,list就是Redis String的列表,按照插入顺序排序。比如使用LPUSH命令在list头插入一个元素,使用RPUSH命令在list的尾插入一个元素。当这两个命令之一作用于一个空的key时,一个新的list就创建出来了。
List的最大长度是2^32-1个元素。
3.Set类型
集合,和数学中的集合概念相似。操作中的key理解为集合的名字。
在Redis中,set就是Redis String的无序集合,不允许有重复元素。
Set的最大元素数是2^32-1。
Redis中对set的操作还有交集、并集、差集等。
4.ZSet(Sorted Set)类型
Zset是set的一个升级版本,在set的基础上增加了一个顺序属性,这一属性在添加修改元素时可以指定,每次指定后zset会自动安装指定值重新调整顺序。可以理解为一张表,一列存value,一列存顺序。操作中的key理解为zset的名字。
Zset的最大元素数是2^32-1。
对于已经有序的zset,仍然可以使用SORT命令,通过指定ASC|DESC参数对其进行排序。
5.hash类型
hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中。
二、jedis操作命令:
1.对value操作的命令
exists(key):确认一个key是否存在
del(key):删除一个key
type(key):返回值的类型
keys(pattern):返回满足给定pattern的所有key
randomkey:随机返回key空间的一个key
rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key
dbsize:返回当前数据库中key的数目
expire:设定一个key的活动时间(s)
ttl:获得一个key的活动时间
select(index):按索引查询
move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库
flushdb:删除当前选择数据库中的所有key
flushall:删除所有数据库中的所有key
2.对String操作的命令
set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string(它们的名称为key1,key2…)的value
setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value
setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时间time
mset(key1, value1, key2, value2,…key N, value N):同时给多个string赋值,名称为key i的string赋值value i
msetnx(key1, value1, key2, value2,…key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,名称 key i赋值为value i
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的子串
3.对List操作的命令
rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
llen(key):返回名称为key的list的长度
lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下同)
ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值为value
lrem(key, count, value):删除count个名称为key的list中值为value的元素。count为0,删除所有值为value的元素,count>0 从头至尾删除count个值为value的元素, count<0从尾到头删除|count|个值为value的元素。
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop 命令的block版本。即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。如果 timeout>0,则遇到 上述情况时,等待timeout秒,如果问题没有解决,则对key i+1开始的list执行pop操作。
brpop(key1, key2,… key N, timeout):rpop的block版本。参考上一命令。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
4.对Set操作的命令
sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合
scard(key) :返回名称为key的set的基数
sismember(key, member) :测试member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, key1, key2,…key N) :求交集并将交集保存到dstkey的集合
sunion(key1, key2,…key N) :求并集
sunionstore(dstkey, key1, key2,…key N) :求并集并将并集保存到dstkey的集合
sdiff(key1, key2,…key N) :求差集
sdiffstore(dstkey, key1, key2,…key N) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素
5.对zset(sorted set)操作的命令
zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。
zrem(key, member) :删除名称为key的zset中的元素member
zincrby(key, increment, member) :如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为incre ment
zrank(key, member) :返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”
zrevrank(key, member) :返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”
zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素
zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素
zrangebyscore(key, min, max):返回名称为key的zset中score >= min且score <= max的所有元素
zcard(key):返回名称为key的zset的基数
zscore(key, element):返回名称为key的zset中元素element的score
zremrangebyrank(key, min, max):删除名称为key的zset中rank >= min且rank <= max的所有元素
zremrangebyscore(key, min, max) :删除名称为key的zset中score >= min且score <= max的所有元素
zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对 于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果 集合中元素的score是所有集合对应元素进行 SUM运算的值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。
6.对Hash操作的命令
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
三、各种数据类型所对应的应用场景
1.String类型的应用场景
String是最常用的一种数据类型,普通的key/value存储.
2.list类型的应用场景
比较适用于列表式存储且顺序相对比较固定,例如:
省份、城市列表
品牌、厂商、车系、车型等列表
拆车坊专题列表...
3.set类型的应用场景
Set对外提供的功能与list类似,当需要存储一个列表数据,又不希望出现重复数据时,可选用set
4.zset(sorted set)类型的应用场景
zset的使用场景与set类似,区别是set不是自动有序的,而zset可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序.当你需要一个有序的并且不重复的集合列表,那么可以选择zset数据结构。例如:
根据PV排序的热门车系车型列表
根据时间排序的新闻列表
5.hash类型的应用场景
类似于表记录的存储
页面视图所需数据的存储
Redis从它的许多竞争继承来的三个主要特点:
Redis数据库完全在内存中,使用磁盘仅用于持久性。
相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。
Redis可以将数据复制到任意数量的从服务器。
Redis 优势
异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。
支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散...
Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案。
Redis从它的许多竞争继承来的三个主要特点:
Redis数据库完全在内存中,使用磁盘仅用于持久性。
相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。
Redis可以将数据复制到任意数量的从服务器。
Redis 优势
异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。
支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。
操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。
多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。
Redis Java连接操作
jedis 是 Redis 官方首选的 Java 客户端开发包
package com.cache.redis.client; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang.SerializationException; import org.apache.log4j.Logger; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.exceptions.JedisException; public class RedisClient { private static final Logger logger = Logger.getLogger(RedisClient.class); private JedisPool pool; private JedisPoolConfig config; private static final String HOST = "127.0.0.1"; private static final int PORT = 6379; private static final int TIMEOUT = 20000; private static final int MAX_ACTIVE = 100; private static final int MAX_IDLE = 100; private static final int MAX_WAIT = 1000; private static final boolean TEST_ON_BORROW = false; private static final boolean TEST_ON_RETURN = true; public RedisClient() { } /** * 初始化JedisPool */ public void initPool() { config = new JedisPoolConfig(); // 最大Jedis实例数 config.setMaxActive(MAX_ACTIVE); // 最大Idle config.setMaxIdle(MAX_IDLE); // 最大等待wait时间 config.setMaxWait(MAX_WAIT); // 获得一个jedis实例的时候是否检查连接可用性ping() config.setTestOnBorrow(TEST_ON_BORROW); // return 一个jedis实例给pool时,是否检查连接可用性 config.setTestOnReturn(TEST_ON_RETURN); pool = new JedisPool(config, HOST, PORT, TIMEOUT); } /** * JedisPool销毁 */ public void destroyPool() { if (null != pool) { pool.destroy(); } } /** * 获得jedis对象 * * @return * @throws JedisException */ private Jedis getJedis() throws JedisException { Jedis jedis = null; try { jedis = pool.getResource(); } catch (JedisException e) { logger.error("failed:jedisPool getResource.", e); if (jedis != null) { pool.returnBrokenResource(jedis); } } return jedis; } /** * jedis销毁 * * @param jedis * @param isBroken */ private void release(Jedis jedis, boolean isBroken) { if (jedis != null) { if (isBroken) { pool.returnBrokenResource(jedis); } else { pool.returnResource(jedis); } } } /** * 序列化 * * @param obj * @return */ public static byte[] serialize(Object obj) { if (obj == null) { return null; } ByteArrayOutputStream baos = null; ObjectOutputStream out = null; try { baos = new ByteArrayOutputStream(512); out = new ObjectOutputStream(baos); out.writeObject(obj); byte[] bytes = baos.toByteArray(); return bytes; } catch (IOException ex) { throw new SerializationException(ex); } finally { try { if (out != null) { out.close(); } } catch (IOException ex) { } } } /** * 反序列化 * * @param objectData * @return */ public static Object deserialize(byte[] objectData) { if (objectData == null) { throw new IllegalArgumentException("The byte[] must not be null"); } ByteArrayInputStream bais = null; ObjectInputStream in = null; try { bais = new ByteArrayInputStream(objectData); in = new ObjectInputStream(bais); return in.readObject(); } catch (ClassNotFoundException ex) { throw new SerializationException(ex); } catch (IOException ex) { throw new SerializationException(ex); } finally { try { if (in != null) { in.close(); } } catch (IOException ex) { } } } /** * 删除dbIndex库中所有key * * @param dbIndex * @return */ public String flushDB(int dbIndex) { Jedis jedis = null; boolean isBroken = false; String result = ""; try { jedis = getJedis(); jedis.select(dbIndex); result = jedis.flushDB(); } catch (Exception e) { isBroken = true; logger.error("flushDB failed:", e); } finally { release(jedis, isBroken); } return result; } /** * 删除所有key * * @return */ public String flushAll() { Jedis jedis = null; boolean isBroken = false; String result = ""; try { jedis = getJedis(); result = jedis.flushAll(); } catch (Exception e) { isBroken = true; logger.error("flushAll failed:", e); } finally { release(jedis, isBroken); } return result; } /** * 判断指定key是否存在 * * @param dbIndex * @param key * @return */ public boolean exists(int dbIndex, String key) { Jedis jedis = null; boolean isBroken = false; boolean flag = false; try { jedis = getJedis(); flag = jedis.exists(key); } catch (Exception e) { isBroken = true; logger.error("", e); } finally { release(jedis, isBroken); } return flag; } /** * 添加Object到cache * * @param dbIndex * @param key * @param obj * @param seconds */ public void addItem(int dbIndex, String key, Object obj, int seconds) { Jedis jedis = null; boolean isBroken = false; try { jedis = getJedis(); jedis.select(dbIndex); if (seconds != 0) { jedis.setex(key.getBytes(), seconds, serialize(obj)); } else { jedis.set(key.getBytes(), serialize(obj)); } } catch (Exception e) { isBroken = true; logger.error("addItem failed:", e); } finally { release(jedis, isBroken); } } /** * 获取指定key的Object * * @param dbIndex * @param key * @return */ public Object getItem(int dbIndex, String key) { Jedis jedis = null; byte[] data = null; boolean isBroken = false; try { jedis = getJedis(); jedis.select(dbIndex); data = jedis.get(key.getBytes()); if (data.length < 0 || data == null) { return null; } return deserialize(data); } catch (Exception e) { isBroken = true; logger.error(" getItem failed:", e); return null; } finally { release(jedis, isBroken); } } /** * 添加Object到cache的List中 * * @param dbIndex * @param key * @param obj */ public void addItemToList(int dbIndex, String key, Object obj) { Jedis jedis = null; boolean isBroken = false; try { jedis = getJedis(); jedis.select(dbIndex); jedis.lpushx(key.getBytes(), serialize(obj)); } catch (Exception e) { isBroken = true; logger.error(" addItemToList failed:", e); } finally { release(jedis, isBroken); } } /** * 获取指定key的List * * @param dbIndex * @param key * @return */ public List<Object> getItemFromList(int dbIndex, String key) { Jedis jedis = null; List<Object> dataList = null; boolean isBroken = false; try { jedis = getJedis(); jedis.select(dbIndex); long len = jedis.llen(key.getBytes()); if (len <= 0) { return null; } List<byte[]> byteList = jedis.lrange(key.getBytes(), 0, (int) (len - 1)); dataList = new ArrayList<Object>(); for (byte[] b : byteList) { dataList.add(deserialize(b)); } } catch (Exception e) { isBroken = true; logger.error(" getItemFromList failed:", e); } finally { release(jedis, isBroken); } return dataList; } /** * 删除指定key * * @param dbIndex * @param key * @return */ public long delItem(int dbIndex, String key) { Jedis jedis = null; boolean isBroken = false; long result = 0; try { jedis = getJedis(); jedis.select(dbIndex); result = jedis.del(key.getBytes()); } catch (Exception e) { isBroken = true; logger.error(" delItem failed:", e); } finally { release(jedis, isBroken); } return result; } /** * 添加Map到cache * * @param dbIndex * @param key * @param map */ public void addMap(int dbIndex, String key, Map<String, String> map) { Jedis jedis = null; boolean isBroken = false; try { jedis = getJedis(); jedis.select(dbIndex); if (map != null && !map.isEmpty()) { for (String mapKey : map.keySet()) { jedis.hset(key, mapKey, map.get(mapKey)); } } } catch (Exception e) { isBroken = true; logger.error(" addMap failed:", e); } finally { release(jedis, isBroken); } } /** * 添加Map到cache * * @param dbIndex * @param key * @param map */ public void addMap(int dbIndex, String key, Map<String, String> map, int seconds) { Jedis jedis = null; boolean isBroken = false; try { jedis = getJedis(); jedis.select(dbIndex); if (map != null && !map.isEmpty()) { for (String mapKey : map.keySet()) { jedis.hset(key, mapKey, map.get(mapKey)); } } if (seconds != 0) { jedis.expire(key, seconds); } } catch (Exception e) { isBroken = true; logger.error(" addMap failed:", e); } finally { release(jedis, isBroken); } } /** * 获取指定key的Map * * @param dbIndex * @param key * @return */ public Map<String, String> getMap(int dbIndex, String key) { Jedis jedis = null; boolean isBroken = false; Map<String, String> map = null; try { jedis = getJedis(); jedis.select(dbIndex); map = jedis.hgetAll(key); } catch (Exception e) { isBroken = true; logger.error(" getMap failed:", e); } finally { release(jedis, isBroken); } return map; } /** * 获取指定key的Map中的field * * @param dbIndex * @param key * @param field * @return */ public String getMapItem(int dbIndex, String key, String field) { Jedis jedis = null; boolean isBroken = false; String result = null; try { jedis = getJedis(); jedis.select(dbIndex); result = jedis.hget(key, field); } catch (Exception e) { isBroken = true; logger.error(" getMapItem failed:", e); } finally { release(jedis, isBroken); } return result; } /** * 判断指定key的Map中的field是否存在 * * @param dbIndex * @param key * @param field * @return */ public boolean isMapFieldExists(int dbIndex, String key, String field) { Jedis jedis = null; boolean isBroken = false; boolean result = false; try { jedis = getJedis(); jedis.select(dbIndex); result = jedis.hexists(key, field); } catch (Exception e) { isBroken = true; logger.error(" isMapFieldExists failed:", e); } finally { release(jedis, isBroken); } return result; } /** * 添加List到cache * * @param dbIndex * @param key * @param list */ public void addList(int dbIndex, String key, List<String> list) { Jedis jedis = null; boolean isBroken = false; try { jedis = getJedis(); jedis.select(dbIndex); if (list != null && !list.isEmpty()) { for (String value : list) { jedis.lpush(key, value); } } } catch (Exception e) { isBroken = true; logger.error(" addList failed:", e); } finally { release(jedis, isBroken); } } /** * 获取指定key的List * * @param dbIndex * @param key * @return */ public List<String> getList(int dbIndex, String key) { Jedis jedis = null; boolean isBroken = false; List<String> list = null; try { jedis = getJedis(); jedis.select(dbIndex); list = jedis.lrange(key, 0, -1); } catch (Exception e) { isBroken = true; logger.error(" getList failed:", e); } finally { release(jedis, isBroken); } return list; } /** * 添加Set到cache * * @param dbIndex * @param key * @param members */ public void addSet(int dbIndex, String key, Set<String> members) { Jedis jedis = null; boolean isBroken = false; try { jedis = getJedis(); jedis.select(dbIndex); if (members != null && !members.isEmpty()) { for (String member : members) { jedis.sadd(key, member); } } } catch (Exception e) { isBroken = true; logger.error(" addSet failed:", e); } finally { release(jedis, isBroken); } } /** * 获取指定key的Set * * @param dbIndex * @param key * @return */ public Set<String> getSet(int dbIndex, String key) { Jedis jedis = null; boolean isBroken = false; Set<String> set = null; try { jedis = getJedis(); jedis.select(dbIndex); set = jedis.smembers(key); } catch (Exception e) { isBroken = true; logger.error(" getSet failed:", e); } finally { release(jedis, isBroken); } return set; } /** * 添加byte[]到cache * * @param dbIndex * @param key * @param bytes */ public void addItemByte(int dbIndex, String key, byte[] bytes) { Jedis jedis = null; boolean isBroken = false; try { jedis = getJedis(); jedis.select(dbIndex); if (bytes != null && bytes.length > 0) { jedis.set(key.getBytes(), bytes); } } catch (Exception e) { isBroken = true; logger.error(" addItemByte failed:", e); } finally { release(jedis, isBroken); } } /** * 获取指定key的byte[] * * @param dbIndex * @param key * @return */ public byte[] getItemByte(int dbIndex, String key) { Jedis jedis = null; boolean isBroken = false; byte[] bytes = null; try { jedis = getJedis(); jedis.select(dbIndex); bytes = jedis.get(key.getBytes()); } catch (Exception e) { isBroken = true; logger.error(" getSet failed:", e); } finally { release(jedis, isBroken); } return bytes; } /** * 添加String到cache * * @param dbIndex * @param key * @param value */ public void addString(int dbIndex, String key, String value) { Jedis jedis = null; boolean isBroken = false; try { jedis = getJedis(); jedis.select(dbIndex); jedis.set(key, value); } catch (Exception e) { isBroken = true; logger.error(" getSet failed:", e); } finally { release(jedis, isBroken); } } /** * 获取指定key的String * * @param dbIndex * @param key */ public String getString(int dbIndex, String key) { Jedis jedis = null; boolean isBroken = false; try { jedis = getJedis(); jedis.select(dbIndex); return jedis.get(key); } catch (Exception e) { isBroken = true; logger.error(" getSet failed:", e); return null; } finally { release(jedis, isBroken); } } /** * 指定key的String加1 * * @param dbIndex * @param key * @return */ public long getIncr(int dbIndex, String key) { Jedis jedis = null; boolean isBroken = false; long result = 0; try { jedis = getJedis(); jedis.select(dbIndex); result = jedis.incr(key); } catch (Exception e) { isBroken = true; logger.error(" getIncr failed:", e); } finally { release(jedis, isBroken); } return result; } /** * 指定key的String加integer * * @param dbIndex * @param key * @return */ public long getIncrBy(int dbIndex, String key, long integer) { Jedis jedis = null; boolean isBroken = false; long result = 0; try { jedis = getJedis(); jedis.select(dbIndex); result = jedis.incrBy(key, integer); } catch (Exception e) { isBroken = true; logger.error(" getIncrBy failed:", e); } finally { release(jedis, isBroken); } return result; } /** * 指定key的String减1 * * @param dbIndex * @param key * @return */ public long getDecr(int dbIndex, String key) { Jedis jedis = null; boolean isBroken = false; long result = 0; try { jedis = getJedis(); jedis.select(dbIndex); result = jedis.decr(key); } catch (Exception e) { isBroken = true; logger.error(" getDecr failed:", e); } finally { release(jedis, isBroken); } return result; } /** * 指定key的String减integer * * @param dbIndex * @param key * @return */ public long getDecr(int dbIndex, String key, long integer) { Jedis jedis = null; boolean isBroken = false; long result = 0; try { jedis = getJedis(); jedis.select(dbIndex); result = jedis.decrBy(key, integer); } catch (Exception e) { isBroken = true; logger.error(" getDecr failed:", e); } finally { release(jedis, isBroken); } return result; } /** * 删除指定key的Set中的元素itemValue * * @param dbIndex * @param key * @param itemValue * @return */ public boolean removeSetItem(int dbIndex, String key, String itemValue) { Jedis jedis = null; boolean isBroken = false; boolean flag = false; try { jedis = getJedis(); jedis.select(dbIndex); Long result = jedis.srem(key, itemValue); if (result == 1) { flag = true; } } catch (Exception e) { isBroken = true; logger.error(" removeSetItem failed:", e); } finally { release(jedis, isBroken); } return flag; } /** * 判断指定key的Set中的元素itemValue是否存在 * * @param dbIndex * @param key * @param itemValue * @return */ public boolean isSetItemExist(int dbIndex, String key, String itemValue) { Jedis jedis = null; boolean isBroken = false; boolean flag = false; try { jedis = getJedis(); jedis.select(dbIndex); flag = jedis.sismember(key, itemValue); } catch (Exception e) { isBroken = true; logger.error(" removeSetItem failed:", e); } finally { release(jedis, isBroken); } return flag; } }
测试类
package com.cache.redis.client; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.junit.After; import org.junit.Before; import org.junit.Test; public class RedisCilentTest { private RedisClient client = null; private static final int DB_INDEX = 0; @Before public void before() { client = new RedisClient(); client.initPool(); } @After public void after() { client.destroyPool(); } @Test public void testAddItem() { String key = "name"; String str = "king"; client.addItem(DB_INDEX, key, str, 120); Object o = client.getItem(DB_INDEX, key); System.out.println(o); } @Test public void testAddString() { String key = "str-key-01"; String count = "9"; client.addString(DB_INDEX, key, count); Object o = client.getString(DB_INDEX, key); System.out.println(o); } @Test public void testAddMap() { Map<String, String> map = new HashMap<String, String>(); map.put("mk-01", "value-01"); map.put("mk-02", "value-02"); map.put("mk-03", "value-03"); map.put("mk-04", "value-04"); client.addMap(DB_INDEX, "map-key-01", map, 6000); } @Test public void testGetMap() { Map<String, String> rMap = client.getMap(DB_INDEX, "map-key-01"); if (rMap != null && !rMap.isEmpty()) { for (String key : rMap.keySet()) { System.out.println("key:" + key + " value :" + rMap.get(key)); } } } @Test public void testAddSet() { Set<String> set = new HashSet<String>(); set.add("set-value-01"); set.add("set-value-02"); set.add("set-value-03"); set.add("set-value-04"); client.addSet(DB_INDEX, "set-key-01", set); } @Test public void testgetSet() { String key = "set-key-01"; Set<String> set = new HashSet<String>(); set = client.getSet(DB_INDEX, key); if (!set.isEmpty()) { System.out.println("Key : " + key); for (String value : set) { System.out.print("value:" + value); } } } @Test public void testAddList() { List<String> list = new ArrayList<String>(); list.add("list-value-01"); list.add("list-value-02"); list.add("list-value-03"); list.add("list-value-04"); client.addList(DB_INDEX, "list-key-01", list); } @Test public void testGetList() { List<String> list = client.getList(DB_INDEX, "list-key-01"); if (list != null && list.size() > 0) { for (String string : list) { System.out.println(string); } } } @Test public void testGetIncrBy() { String key = "str-key-02"; int count = 80; client.addString(DB_INDEX, key, String.valueOf(count)); long r = client.getIncrBy(DB_INDEX, key, 10); System.out.println(r); } }
附:Jedis操作命令
一、常用数据类型简介:
redis常用五种数据类型:string,hash,list,set,zset(sorted set).
1.String类型
String是最简单的类型,一个key对应一个value
String类型的数据最大1G。
String类型的值可以被视作integer,从而可以让“INCR”命令族操作(incrby、decr、decrby),这种情况下,该integer的值限制在64位有符号数。
在list、set和zset中包含的独立的元素类型都是Redis String类型。
2.List类型
链表类型,主要功能是push、pop、获取一个范围的所有值等。其中的key可以理解为链表的名字。
在Redis中,list就是Redis String的列表,按照插入顺序排序。比如使用LPUSH命令在list头插入一个元素,使用RPUSH命令在list的尾插入一个元素。当这两个命令之一作用于一个空的key时,一个新的list就创建出来了。
List的最大长度是2^32-1个元素。
3.Set类型
集合,和数学中的集合概念相似。操作中的key理解为集合的名字。
在Redis中,set就是Redis String的无序集合,不允许有重复元素。
Set的最大元素数是2^32-1。
Redis中对set的操作还有交集、并集、差集等。
4.ZSet(Sorted Set)类型
Zset是set的一个升级版本,在set的基础上增加了一个顺序属性,这一属性在添加修改元素时可以指定,每次指定后zset会自动安装指定值重新调整顺序。可以理解为一张表,一列存value,一列存顺序。操作中的key理解为zset的名字。
Zset的最大元素数是2^32-1。
对于已经有序的zset,仍然可以使用SORT命令,通过指定ASC|DESC参数对其进行排序。
5.hash类型
hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中。
二、jedis操作命令:
1.对value操作的命令
exists(key):确认一个key是否存在
del(key):删除一个key
type(key):返回值的类型
keys(pattern):返回满足给定pattern的所有key
randomkey:随机返回key空间的一个key
rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key
dbsize:返回当前数据库中key的数目
expire:设定一个key的活动时间(s)
ttl:获得一个key的活动时间
select(index):按索引查询
move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库
flushdb:删除当前选择数据库中的所有key
flushall:删除所有数据库中的所有key
2.对String操作的命令
set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string(它们的名称为key1,key2…)的value
setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value
setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时间time
mset(key1, value1, key2, value2,…key N, value N):同时给多个string赋值,名称为key i的string赋值value i
msetnx(key1, value1, key2, value2,…key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,名称 key i赋值为value i
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的子串
3.对List操作的命令
rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
llen(key):返回名称为key的list的长度
lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下同)
ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值为value
lrem(key, count, value):删除count个名称为key的list中值为value的元素。count为0,删除所有值为value的元素,count>0 从头至尾删除count个值为value的元素, count<0从尾到头删除|count|个值为value的元素。
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop 命令的block版本。即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。如果 timeout>0,则遇到 上述情况时,等待timeout秒,如果问题没有解决,则对key i+1开始的list执行pop操作。
brpop(key1, key2,… key N, timeout):rpop的block版本。参考上一命令。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
4.对Set操作的命令
sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合
scard(key) :返回名称为key的set的基数
sismember(key, member) :测试member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, key1, key2,…key N) :求交集并将交集保存到dstkey的集合
sunion(key1, key2,…key N) :求并集
sunionstore(dstkey, key1, key2,…key N) :求并集并将并集保存到dstkey的集合
sdiff(key1, key2,…key N) :求差集
sdiffstore(dstkey, key1, key2,…key N) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素
5.对zset(sorted set)操作的命令
zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。
zrem(key, member) :删除名称为key的zset中的元素member
zincrby(key, increment, member) :如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为incre ment
zrank(key, member) :返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”
zrevrank(key, member) :返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”
zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素
zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素
zrangebyscore(key, min, max):返回名称为key的zset中score >= min且score <= max的所有元素
zcard(key):返回名称为key的zset的基数
zscore(key, element):返回名称为key的zset中元素element的score
zremrangebyrank(key, min, max):删除名称为key的zset中rank >= min且rank <= max的所有元素
zremrangebyscore(key, min, max) :删除名称为key的zset中score >= min且score <= max的所有元素
zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对 于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果 集合中元素的score是所有集合对应元素进行 SUM运算的值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。
6.对Hash操作的命令
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
三、各种数据类型所对应的应用场景
1.String类型的应用场景
String是最常用的一种数据类型,普通的key/value存储.
2.list类型的应用场景
比较适用于列表式存储且顺序相对比较固定,例如:
省份、城市列表
品牌、厂商、车系、车型等列表
拆车坊专题列表...
3.set类型的应用场景
Set对外提供的功能与list类似,当需要存储一个列表数据,又不希望出现重复数据时,可选用set
4.zset(sorted set)类型的应用场景
zset的使用场景与set类似,区别是set不是自动有序的,而zset可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序.当你需要一个有序的并且不重复的集合列表,那么可以选择zset数据结构。例如:
根据PV排序的热门车系车型列表
根据时间排序的新闻列表
5.hash类型的应用场景
类似于表记录的存储
页面视图所需数据的存储
相关文章推荐
- Redis Quick Start [熟练版]
- Redis Quick Start [遇到问题解决问题版]
- WPF/E CTP Quick Start - 第二部分:创建一个XAML文件(翻译)
- crossplatform---electron Quick Start
- Rai StudiesQuick Start Site for JAVA Developers
- Apache Thrift with Java Quickstart(thrift入门及Java实例)
- [App] WildFly + apache-maven + quickstart
- The QuickStart Guide to Learning BizTalk Server 2004
- ASP.NET Mobile Web Application Quickstart
- MyEclipse Hibernate Quickstart
- WPF/E CTP Quick Start - 第七部分:文本(翻译)
- Ajax.Net Professional——A quick guide how to start(AjaxPro开始向导)
- MongoDB--CSharp Driver Quickstart
- AO入门秘籍,ArcObjects快速入门,ArcObjects QuickStart
- Hadoop QuickStart VM
- Taste of Zend Framework Quick Start
- LXC quick start
- iBatisNet Quick Start
- struts quick start