设为首页 收藏本站
查看: 816|回复: 0

[经验分享] Java Redis Jedis--学习笔记代码片断--序列化

[复制链接]

尚未签到

发表于 2015-11-12 13:22:47 | 显示全部楼层 |阅读模式
  Java Redis Jedis--学习笔记代码片断--序列化


  维基百科 : Redis是一个开源、支持网络、基于内存、键值对存储数据库,使用ANSI C编写。其开发由VMware主持。根据月度排行网站DB-Engines.com的数据显示,Redis是最流行的键值对存储数据库。http://zh.wikipedia.org/wiki/Redis
  学习资料:1 <<The Little Redis Book >> https://github.com/jarvischen/the-little-redis-book-cn/blob/master/cn/redis.md
  

package com.jiangge.jrtest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import redis.clients.jedis.Jedis;
public class JedisTest {
public static void main(String[] args) {
JedisTest jrd = new JedisTest();
jrd.test();
}
public void test(){
Jedis  jedis = new Jedis(&quot;localhost&quot;); //连接redis  Jedis jedis = new Jedis(&quot;134.152.244.234&quot;,6379);  
//redis.auth(&quot;redis&quot;); //验证密码
//jedis.flushAll(); //删除所有key
//Set keys = jedis.keys(&quot;*&quot;);
//System.out.println(keys);
jedis.set(&quot;test&quot;, &quot;helloword!&quot;);
jedis.set(&quot;foo&quot;, &quot;foovaluehehehehe!&quot;);
String value = jedis.get(&quot;test&quot;);
System.out.println(value);
//列出所有的key,查找特定的key如:redis.keys(&quot;foo&quot;)
Set keys = jedis.keys(&quot;*&quot;);
Iterator t1 = keys.iterator() ;
while(t1.hasNext()){
Object obj1 = t1.next();
System.out.println(obj1);
}
//DEL 移除给定的一个或多个key。如果key不存在,则忽略该命令。
Long delResult = jedis.del(&quot;name1&quot;);
System.out.println(&quot;delResult ==>&quot; + delResult);
//TTL 返回给定key的剩余生存时间(time to live)(以秒为单位)
Long ttlResult = jedis.ttl(&quot;foo&quot;);
System.out.println(&quot;ttlResult ==>&quot; + ttlResult);
//PERSIST key 移除给定key的生存时间。
Long persistResult = jedis.persist(&quot;foo&quot;);
System.out.println(&quot;persistResult ==>&quot; + persistResult);
//EXISTS 检查给定key是否存在。
Boolean existsResult = jedis.exists(&quot;foo&quot;);
System.out.println(&quot;existsResult ==>&quot; + existsResult);
//MOVE key db  将当前数据库(默认为0)的key移动到给定的数据库db当中。如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定key,或者key不存在于当前数据库,那么MOVE没有任何效果。
jedis.move(&quot;foo&quot;, 1);//将foo这个key,移动到数据库1
//RENAME key newkey  将key改名为newkey。当key和newkey相同或者key不存在时,返回一个错误。当newkey已经存在时,RENAME命令将覆盖旧值。
jedis.rename(&quot;foo&quot;, &quot;foonew&quot;);
//TYPE key 返回key所储存的值的类型。
System.out.println(&quot;key所储存的值的类型 ==>&quot; + jedis.type(&quot;test&quot;));//none(key不存在),string(字符串),list(列表),set(集合),zset(有序集),hash(哈希表)
//EXPIRE key seconds 为给定key设置生存时间。当key过期时,它会被自动删除。
jedis.expire(&quot;foo&quot;, 5);//5秒过期
//EXPIREAT EXPIREAT的作用和EXPIRE一样,都用于为key设置生存时间。不同在于EXPIREAT命令接受的时间参数是UNIX时间戳(unix timestamp)。
//一般SORT用法 最简单的SORT使用方法是SORT key。
jedis.lpush(&quot;sort&quot;, &quot;1&quot;);
jedis.lpush(&quot;sort&quot;, &quot;4&quot;);
jedis.lpush(&quot;sort&quot;, &quot;6&quot;);
jedis.lpush(&quot;sort&quot;, &quot;3&quot;);
jedis.lpush(&quot;sort&quot;, &quot;0&quot;);
List list = jedis.sort(&quot;sort&quot;); //默认是升序
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
//----------- STRING------------------//
//SET key value将字符串值value关联到key。
jedis.set(&quot;name&quot;, &quot;yixiaohan&quot;);
jedis.set(&quot;id&quot;, &quot;007&quot;);
jedis.set(&quot;address&quot;, &quot;beijing&quot;);
//SETEX key seconds value将值value关联到key,并将key的生存时间设为seconds(以秒为单位)。
jedis.setex(&quot;foo&quot;, 5, &quot;haha&quot;);
//MSET key value [key value ...]同时设置一个或多个key-value对。
jedis.mset(&quot;kevin&quot;,&quot;111&quot;,&quot;keso&quot;,&quot;222&quot;);
//redis.flushAll();清空所有的key
System.out.println(&quot;dbSize ==>&quot; + jedis.dbSize());//dbSize是多少个key的个数
//APPEND key value如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值之后。
System.out.println(&quot;append before==>&quot; + jedis.get(&quot;foo&quot;));
jedis.append(&quot;foo&quot;, &quot;00&quot;);//如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值之后。
System.out.println(&quot;append after==>&quot; + jedis.get(&quot;foo&quot;));
//GET key 返回key所关联的字符串值
String getResult = jedis.get(&quot;name&quot;);
System.out.println(&quot;getResult==>&quot; + getResult);
//MGET key [key ...] 返回所有(一个或多个)给定key的值, 如果key不存在,则返回null
List getList = jedis.mget(&quot;address&quot;,&quot;name&quot;, &quot;myboss&quot;);
for(int i=0; i<getList.size(); i++){
System.out.println(getList.get(i));
}
//DECR key 将key中储存的数字值减一。
//DECRBY key decrement 将key所储存的值减去减量decrement。
//INCR key 将key中储存的数字值增一。
//INCRBY key increment 将key所储存的值加上增量increment。
System.out.println(&quot;\n&quot; + &quot;==============Hash 操作(key field value)================&quot;);
//HSET key field value将哈希表key中的域field的值设为value。
jedis.hset(&quot;website&quot;, &quot;google&quot;, &quot;www.google.cn&quot;);
jedis.hset(&quot;website&quot;, &quot;baidu&quot;, &quot;www.baidu.com&quot;);
jedis.hset(&quot;website&quot;, &quot;sina&quot;, &quot;www.sina.com&quot;);
//HMSET key field value [field value ...] 同时将多个field - value(域-值)对设置到哈希表key中。
Map<String,String> map = new HashMap<String,String>();
map.put(&quot;cardid&quot;, &quot;123456&quot;);
map.put(&quot;username&quot;, &quot;yixiaohan&quot;);
jedis.hmset(&quot;hash&quot;, map);
//HGET key field返回哈希表key中给定域field所对应的值。
System.out.println(&quot;哈希表key中给定域field所对应的值==>&quot; + jedis.hget(&quot;hash&quot;, &quot;username&quot;));
//HMGET key field [field ...]返回哈希表key中,一个或多个给定域的值。
List hlist = jedis.hmget(&quot;website&quot;,&quot;google&quot;,&quot;baidu&quot;,&quot;sina&quot;);
for(int i=0;i<hlist.size();i++){
System.out.println(&quot;hmget()返回哈希表key中,一个或多个给定域的值==> &quot; + hlist.get(i));
}
//HGETALL key返回哈希表key中,所有的域和值。
Map<String,String> allmap = jedis.hgetAll(&quot;hash&quot;);
for(Map.Entry entry: allmap.entrySet()) {
System.out.print(entry.getKey() + &quot;:&quot; + entry.getValue() + &quot;\t&quot;);
}
//HDEL key field [field ...]删除哈希表key中的一个或多个指定域。
//HLEN key 返回哈希表key中域的数量。
//HEXISTS key field查看哈希表key中,给定域field是否存在。
//HINCRBY key field increment为哈希表key中的域field的值加上增量increment。
//HKEYS key返回哈希表key中的所有域。
//HVALS key返回哈希表key中的所有值。
System.out.println(&quot;\n&quot; + &quot;==================== LIST 操作 =====================&quot;);
//LPUSH key value [value ...]将值value插入到列表key的表头。//LPUSH puts the new value at the start of the list
jedis.lpush(&quot;mylist&quot;, &quot;abc&quot;);
jedis.lpush(&quot;mylist&quot;, &quot;xzc&quot;);
jedis.lpush(&quot;mylist&quot;, &quot;erf&quot;);
jedis.lpush(&quot;mylist&quot;, &quot;bnh&quot;);
//LRANGE key start stop返回列表key中指定区间内的元素,区间以偏移量start和stop指定。下标(index)参数start和stop都以0为底,
//也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。
//你也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。
List listy = jedis.lrange(&quot;mylist&quot;, 0, -1);//LRANGE mylist 0 -1  ==> 其中 -1 返回所有的值.
for(int i=0;i<listy.size();i++){
System.out.println(listy.get(i));
}
System.out.println(&quot;列表key的长度==>&quot; + jedis.llen(&quot;mylist&quot;));
//LLEN key返回列表key的长度。
//LREM key count value根据参数count的值,移除列表中与参数value相等的元素。
System.out.println(&quot;\n&quot; + &quot;===========  SET 操作 =====================&quot;);
//SADD key member [member ...]将member元素加入到集合key当中。
jedis.sadd(&quot;testSet&quot;, &quot;s1&quot;);
jedis.sadd(&quot;testSet&quot;, &quot;s2&quot;);
jedis.sadd(&quot;testSet&quot;, &quot;s3&quot;);
jedis.sadd(&quot;testSet&quot;, &quot;s4&quot;);
jedis.sadd(&quot;testSet&quot;, &quot;s5&quot;);
//SREM key member移除集合中的member元素。
jedis.srem(&quot;testSet&quot;, &quot;s5&quot;);
//SMEMBERS key返回集合key中的所有成员。
Set set = jedis.smembers(&quot;testSet&quot;);
Iterator ite=set.iterator() ;
while(ite.hasNext()){
Object obj1=ite.next();
System.out.println(obj1);
}
//SISMEMBER key member判断member元素是否是集合key的成员。是(true),否则(false)
boolean isInSet = jedis.sismember(&quot;testSet&quot;, &quot;s4&quot;);
System.out.println(&quot;sismember()判断member元素是否是集合key的成员==>&quot; + isInSet);
//SCARD key返回集合key的基数(集合中元素的数量)。
//SMOVE source destination member将member元素从source集合移动到destination集合。
//SINTER key [key ...]返回一个集合的全部成员,该集合是所有给定集合的交集。
//SINTERSTORE destination key [key ...]此命令等同于SINTER,但它将结果保存到destination集合,而不是简单地返回结果集
//SUNION key [key ...]返回一个集合的全部成员,该集合是所有给定集合的并集。
//SUNIONSTORE destination key [key ...]此命令等同于SUNION,但它将结果保存到destination集合,而不是简单地返回结果集。
//SDIFF key [key ...]返回一个集合的全部成员,该集合是所有给定集合的差集 。
//SDIFFSTORE destination key [key ...]此命令等同于SDIFF,但它将结果保存到destination集合,而不是简单地返回结果集。
}
}



  
  


  =====================================================================================


  


  序列化:
  Person.java
  

package com.jiangge.jrtest;
import java.io.Serializable;
@SuppressWarnings(&quot;serial&quot;)
public class Person implements Serializable {
private int id;
private String name;
public Person() {
}
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

  
  


  


  PersonRedisSerializeTest.java



package com.jiangge.jrtest;
import redis.clients.jedis.Jedis;
public class PersonRedisSerializeTest {
public static void main(String[] args) {
PersonRedisSerializeTest test = new PersonRedisSerializeTest();
test.setObject(); //序列化
test.getObject(); //反序列化
}
/**
* 序列化写对象, 将Person对象写入Redis中
*
* 我们到命令行窗口中读取该对象,看看有没有写入成功:
*    redis 127.0.0.1:6379> get person:100
*    &quot;\xac\xed\x00\x05sr\x00\x19com.jiangge.jrtest.Person\xfa\x13\xad$\x8e$\xfc\x80\x
*    02\x00\x02I\x00\x02idL\x00\x04namet\x00\x12Ljava/lang/String;xp\x00\x00\x00dt\x0
*    0\tyixiaohan&quot;
* 可以取到序列化之后的值。
*/
public void setObject() {
Jedis jedis=new Jedis(&quot;localhost&quot;);
jedis.set(&quot;person:100&quot;.getBytes(), SerializeUtil.serialize(new Person(100, &quot;yixiaohan&quot;)));
jedis.set(&quot;person:101&quot;.getBytes(), SerializeUtil.serialize(new Person(101, &quot;xiaowei&quot;)));
}
/** 反序列化取对象 */
public void getObject() {
Jedis jedis=new Jedis(&quot;localhost&quot;);
byte[] data100= jedis.get((&quot;person:100&quot;).getBytes());
Person person100 = (Person) SerializeUtil.unserialize(data100);
System.out.println(String.format(&quot;person:100->id=%s,name=%s&quot;, person100.getId(), person100.getName()));
byte[] data101= jedis.get((&quot;person:101&quot;).getBytes());
Person person101 = (Person) SerializeUtil.unserialize(data101);
System.out.println(String.format(&quot;person:101->id=%s,name=%s&quot;, person101.getId(), person101.getName()));
}
}
  


  SerializeUtil.java


  

package com.jiangge.jrtest;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializeUtil {
/**
* 序列化
* @param object
*/
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;
}
/**
* 反序列化
* @param bytes
*/
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;
}
}



  

启动 redis server: DSC0000.jpg






  执行序列化代码后,在 redis client中查看结果:
DSC0001.jpg


  


  


  IDE控制台输出结果:
DSC0002.jpg


  


  =====================================================================================
  Redis: key-value NoSQL Database





SET server:name &quot;fido&quot;

GET server:name





SET connections 10

INCR connections => 11

INCR connections => 12

DEL connections

INCR connections => 1





DEL to delete a given key and associated value

  SET-if-not-exists (called SETNX on Redis)

   INCR to atomically increment a number stored at a given key





an atomic operation 原子操作

an atomic operation concepts

h multi-threaded environments

所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)









a key should only exist for a certain length of time. This is accomplished with the EXPIRE and TTL commands.

key 存活于指定的时间,时间到则销亡

You can test how long a key will exist for with the TTL command

TTL命令: key 还将存活多长时间 返回给定key的剩余生存时间(time to live)(以秒为单位)





complex data structures

数据结构:

list列表:相关命令, RPUSH, LPUSH, LLEN, LRANGE, LPOP, RPOP

RPUSH puts the new value at the end of the list.结尾

RPUSH friends &quot;Alice&quot;





LPUSH puts the new value at the start of the list.开头

LPUSH friends &quot;Sam&quot;





LRANGE gives a subset of the list,给定范围内的&#20540;.其中 -1 返回所有的&#20540;.

LRANGE friends 0 -1 => [&quot;Sam&quot;,&quot;Alice&quot;,&quot;Bob&quot;]

LRANGE friends 0 1 => [&quot;Sam&quot;,&quot;Alice&quot;]

LRANGE friends 1 2 => [&quot;Alice&quot;,&quot;Bob&quot;]









LLEN returns the current length of the list.返回当前列表的长度

   LLEN friends => 3









LPOP removes the first element from the list and returns it.删除并返回列表中第一个&#20540;

   LPOP friends => &quot;Sam&quot;









RPOP removes the last element from the list and returns it.删除并返回列表中最后一个&#20540;

   RPOP friends => &quot;Bob&quot;





Note that the list now only has one element:

   LLEN friends => 1

   LRANGE friends 0 -1 => [&quot;Alice&quot;]









set集合:相关命令: SADD, SREM, SISMEMBER, SMEMBERS, SUNION

SADD adds the given value to the set.添加

    SADD superpowers &quot;flight&quot;

    SADD superpowers &quot;x-ray vision&quot;

    SADD superpowers &quot;reflexes&quot;





SREM removes the given value from the set.删除

    SREM superpowers &quot;reflexes&quot;





SISMEMBER tests if the given value is in the set.查看是否在集合中,也即查看是否是集合的成员

    SISMEMBER superpowers &quot;flight&quot; => true,1

    SISMEMBER superpowers &quot;reflexes&quot; => false,0





SMEMBERS returns a list of all the members of this set.返回集合中所有的成员,以列表的形式返回.

    SMEMBERS superpowers => [&quot;flight&quot;,&quot;x-ray vision&quot;]





SUNION combines two or more sets and returns the list of all elements.将多个集合合并

    SADD birdpowers &quot;pecking&quot;

    SADD birdpowers &quot;flight&quot;

    SUNION superpowers birdpowers => [&quot;flight&quot;,&quot;x-ray vision&quot;,&quot;pecking&quot;]



the sorted set有序集合. It is similar to a regular set, but now each value has an associated score标记.

This score is used to sort the elements in the set.

    ZADD hackers 1940 &quot;Alan Kay&quot;

    ZADD hackers 1906 &quot;Grace Hopper&quot;

    ZADD hackers 1953 &quot;Richard Stallman&quot;

    ZADD hackers 1965 &quot;Yukihiro Matsumoto&quot;

    ZADD hackers 1916 &quot;Claude Shannon&quot;

    ZADD hackers 1969 &quot;Linus Torvalds&quot;

    ZADD hackers 1957 &quot;Sophie Wilson&quot;

    ZADD hackers 1912 &quot;Alan Turing&quot;





In these examples, the scores are years of birth and the values are the names of famous hackers.

    ZRANGE hackers 2 4 => [&quot;Claude Shannon&quot;, &quot;Alan Kay&quot;,&quot;Richard Stallman&quot;]


  


  


  参考资料:
  http://try.redis.io/


  其他网络资料,有待把链接补充进来

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138354-1-1.html 上篇帖子: Redis 存储List对象 下篇帖子: SPRING DATA
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表