Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Jedis是Redis官方首选的Java客户端开发包,Redis是一个开源的Key-Value数据缓存。
使用JAVA进行Redis开发需要安装Jedis客户端,并且会用到相关的jar包:
jedis.jar:开发过程中使用的最基本的jar包
commons-pool.jar:当需要连接池时需要的jar包
jedis开发可以针对String、list、set、map、entity进行不同的操作,即可以保存不同类型的key-value键值对。
1、连接Redis:参数1、redis服务器IP(这里为本地的电脑IP),参数2、端口(这里为本地的端口号),参数3、连接时间(需不需要该参数视具体情况而定)
Jedis jedis = new Jedis("127.0.1.1","6379",5000);
2、密码验证,当连接Redis时不需要密码验证的时候,就可以省略掉本行代码
jedis.auth("pwd");
3、开始连接
jedis.connect();
4、断开连接
jedis.disconnect();
5、jedis的一些常用操作:
a、列出所有的key
Set jedisKeys = jedis.keys("*");
b、查找指定的key
Set keys = jedis.keys("key");
c、移除指定的一个或多个key,如果key不存在,则忽略此命令:
jedis.del("key1","key2",...);
d、检查指定的key是否存在:
jedis.exists("key");
e、将存在的key1进行重命名为key2,当操作的key不存在或者key1与key2相同时,会报错
jedis.rename("key1","key2");
f、获取存储key值得类型(String、list、set、map、entity):
jedis.type("key");
g、设置key值得生存时间,当key过期时,该key会被自动删除:参数1、key值,参数2、生存时间,单位为秒
jedis.expire("key",10);
h、移除key值得生存时间,移除后该key永不过期
jedis.persist("key");
i、返回jedis中key值得个数:
jedis.dbSize();
6、jedis对String的操作:
a、添加key-value键值对:(如果存在相同的key,覆盖原来的value)
jedis.set("key","value");
b、添加key-value键值对:(如果key值存在则不做任何操作,不存在设值成功)
jedis.setnx("key", "value");
c、添加key-value键值对,并设置key值的有效期(如果key值存在则覆盖,设置成功返回‘OK’)
jedis.setex("key", seconds, "value")
d、修改对应key的value值
jedis.setrange("key", 6, "value")
e、同时设置一个或多个key-value键值对:(如果某个key-value存在会用新值覆盖原来的旧值,总是成功,成功返回OK)
jedis.mset("key1", "value1", "key2", "value2", ..., ...);
f、同时设置一个或多个 key-value键值对:(如果某个key-value存在返回0,所有操作都会回滚, 如果成功返回ok)
jedis.msetnx("key1", "value1", "key2", "value2",...,...)
g、通过key值获取对应的value值,如果key不存在 返回null
jedis.get("key");
h、通过key获取对应的value,然后通过key设置新的value值
jedis.getSet("key","value");
i、返回key对应的value值的指定字符
jedis.getrange("key", start, end);
j、返回多个key的value值:
jedis.mget("key1","key2",...);
k、返回key对应value加1后的值(原value值必须是String类型的Integer值)
jedis.incr("key");
l、返回key对应value减1后的值(原value值必须是String类型的Integer值)
jedis.decr("key");
m、返回指定key对应value加指定值后的新值,如果key不存在则认为原来的value为0(原value值必须是String类型的Integer值)
jedis.incrBy("key",num);
n、返回指定key对应value减指定值后的新值,如果key不存在则认为原来的value为0(原value值必须是String类型的Integer值)
jedis.decrBy("key",num);
o、给指定的key的值追加, 返回新字符串的长度
jedis.append("key","appValue");
p、取得指定key的value值的长度
jedis.strlen("key");
7、jedis对list的操作:
在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不
存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除
a、从list的右边插入元素(插入的value值可以是一个或多个):
jedis.rpush("key","value1","value2",...);
b、从list的左边插入元素(插入的value值可以是一个或多个):
jedis.lpush("key","value1","value2",...);
c、返回指定Key关联的链表中元素的数量,如果该Key不存在,则返回0
jedis.llen("key");
d、返回指定范围内元素的列表。其中start的值也可以为负值,-1将表示链表中的最后一个元素,即尾部元素,-2表示倒数第二个并以此类推。该命令在获取元素时,start和end位置上的元素也会被取出。如果start的值大于链表中元素的数量,空链表将会被返回。如果end的值大于元素的数量,该命令则获取从start(包括start)开始,链表中剩余的所有元素
jedis.lrange("key",start,end);
e、该命令将仅保留指定范围内的元素,从而保证链接中的元素数量相对恒定。start和stop也可以为负值,-1表示尾部元素。如果start大于链表的尾部,或start大于stop,该命令不错报错,而是返回一个空的链表,与此同时该Key也将被删除。如果stop大于元素的数量,则保留从start开始剩余的所有元素。
jedis.ltrim("key",start,end);
f、返回链表中指定位置(index)的元素,0表示头部元素,如果index为-1,表示尾部元素
jedis.lindex("key",index);
g、给链表中指定位置的值替换为新值,0表示头部元素,如果index为-1,表示尾部元素
jedis.lset("key",index,"newValue");
h、在指定Key关联的链表中,删除前count个值等于value的元素。如果count大于0,从头向尾遍历并删除,如果count小于0,则从尾向头遍历并删除。如果count等于0,则删除链表中所有等于value的元素。如果指定的Key不存在,则直接返回0,返回被删除的元素数量
jedis.lrem("key",count,value);
i、从指定list按顺序取出元素(从右边),返回取出的元素:
jedis.rpop("key");
j、从指定list按顺序取出元素(从左边),返回取出的元素:
jedis.lpop("key");
8、jedis对set的操作:
a、向set中增加元素:
jedis.sadd("key","value");
b、查询指定key对应的所有value值:
jedis.smembers("key");
c、移除指定的key-value值:
jedis.srem("key","remValue");
d、判断当前value是否是指定key集合中的元素:
jedis.sismember("key", "value");
e、返回指定key集合元素的个数:
jedis.scard("key");
f、取交集:
jedis.sinter("key1","key2");
g、取并集
jedis.sunion("key1","key2");
h、取差集:
jedis.sdiff("key1","key2");
9、jedis对map的操作:
a、向map中增加元素(key:关联map的key):
jedis.hmset("key",new HashMap());
b、从map集合中取指定的key的value值(key:关联map的key;mapKey:map中key-value的key,可以为一个或多个):
jedis.hmget("key","mapKey");
c、删除map中的某个键值(key:关联map的key,mapKey:map中key-value的key):
jedis.hdel("key","mapKey");
d、返回map集合中key值存放的值的个数():
jedis.hlen("key");
e、是否存在指定key值的记录:
jedis.exists("key");
f、返回map对象中的所有key:
jedis.hkeys("key");
g、返回map对象中的所有value:
jedis.hvalues("key");
h、向map中增加元素
jedis.hset("key","entryKey","entryValue");
i、判断某个值是否存在
jedis.hexists("hashs", "entryKey");
j、从map集合中取指定的key的value值(key:关联map的key;mapKey:map中key-value的key)
jedis.hget("key","entryKey");
k、为key中的域 field 的值加上增量 increment
jedis.hincrBy("hashs", "entryKey", 123l);
l、根据key获取指定的map
jedis.hgetall("key");
10、jedis对实体的操作:
Redis服务器不能直接存储实体,故对实体的操作中需要进行序列化和反序列化。剩下的操作和jedis操作String、list、set、map基本类似,把之前的key值类型由String改为byte[]就OK啦!
a、实体序列化:
public static byte[] serialize(Object object) {
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
return bytes;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
b、反序列化:
public static Object unserialize(byte[] bytes) {
ByteArrayInputStream bais = null;
try {
bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
c、从list的右边插入object元素(插入的value值可以是一个或多个):
jedis.rpush(byte[] key, byte[] obj);
d、根据指定的key获取list的长度:
jedis.llen(byte[] key);
e、从指定list按顺序取出元素(从右边),返回取出的元素:
jedis.rpop(byte[] key);
注:其他各种操作都类似jedis操作String、list、set、map,把之前的key值类型由String改为byte[]就OK啦!
10、Redis连接池配置等请http://www.baidu.com.
Redis学习总结就此结束!