【redis,1】java操作redis: 将string、list、map、自定义的对象保存到redis中,mapredis
一、操作string 、list 、map 对象 1、引入jar: jedis-2.1.0.jar 2、代码 /** * @param args */ public static void main(String[] args) { //连接redis服务 Jedis jedis = new Jedis("192.168.88.15",6379); //密码验证-如果你没有设置redis密码可不验证即可使用相关命令 // jedis.auth("abcdefg"); //简单的key-value 存储 jedis.set("redis", "myredis"); System.out.println(jedis.get("redis")); //在原有值得基础上添加,如若之前没有该key,则导入该key //之前已经设定了redis对应"myredis",此句执行便会使redis对应"myredisyourredis" jedis.append("redis", "yourredis"); jedis.append("content", "rabbit"); //mset 是设置多个key-value值 参数(key1,value1,key2,value2,...,keyn,valuen) //mget 是获取多个key所对应的value值 参数(key1,key2,key3,...,keyn) 返回的是个list jedis.mset("name1","yangw","name2","demon","name3","elena"); System.out.println(jedis.mget("name1","name2","name3")); //map Map<String,String> user = new HashMap<String,String>(); user.put("name", "cd"); user.put("password", "123456"); //map存入redis jedis.hmset("user", user); //mapkey个数 System.out.println(String.format("len:%d", jedis.hlen("user"))); //map中的所有键值 System.out.println(String.format("keys: %s", jedis.hkeys("user") )); //map中的所有value System.out.println(String.format("values: %s", jedis.hvals("user") )); //取出map中的name字段值 List<String> rsmap = jedis.hmget("user", "name","password"); System.out.println(rsmap); //删除map中的某一个键值 password jedis.hdel("user", "password"); System.out.println(jedis.hmget("user", "name", "password")); //list jedis.del("listDemo"); System.out.println(jedis.lrange("listDemo", 0, -1)); jedis.lpush("listDemo", "A"); jedis.lpush("listDemo", "B"); jedis.lpush("listDemo", "C"); System.out.println(jedis.lrange("listDemo", 0, -1)); System.out.println(jedis.lrange("listDemo", 0, 1)); //set jedis.sadd("sname", "wobby"); jedis.sadd("sname", "kings"); jedis.sadd("sname", "demon"); System.out.println(String.format("set num: %d", jedis.scard("sname"))); System.out.println(String.format("all members: %s", jedis.smembers("sname"))); System.out.println(String.format("is member: %B", jedis.sismember("sname", "wobby"))); System.out.println(String.format("rand member: %s", jedis.srandmember("sname"))); //删除一个对象 jedis.srem("sname", "demon"); System.out.println(String.format("all members: %s", jedis.smembers("sname"))); } 二、将自定义对象保存到redis中:1、自定义pojo 实现Serializable 接口: package cn.mingyuan.redis; import java.io.Serializable; /** * 测试用pojo,实现了Serializable,以便进行系列化操作 * * @author mingyuan * */ public class Person implements Serializable { private static final long serialVersionUID = -3562550857760039655L; private String name; private int age; public Person(){} public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } } 2、测试类: package cn.mingyuan.redis; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import redis.clients.jedis.Jedis; public class Test { /** * @param args * @throws IOException * @throws ClassNotFoundException */ public static void main(String[] args) throws IOException, ClassNotFoundException { // Jedis redis = new Jedis("192.168.88.15"); Jedis redis = new Jedis("192.168.88.15", 6379); // connect可以不要,因为在执行set操作的时候会先进行判断客户端是否于服务器端建立了连接,若无,则启动连接过程 redis.connect(); String set = redis.set("mingyuan", "1"); System.out.println(" set result \t" + set); redis.incr("mingyuan"); String string = redis.get("mingyuan"); System.out.println(" get result of key 'mingyuan' \t" + string); // 下面是对对象进行存储的测试代码 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); Person person = new Person("liudehua" ,22); oos.writeObject(person); byte[] byteArray = bos.toByteArray(); oos.close(); bos.close(); String setObjectRet = redis.set("mingyuan".getBytes(), byteArray); System.out.println(" set object return \t" + setObjectRet); byte[] bs = redis.get("mingyuan".getBytes()); ByteArrayInputStream bis = new ByteArrayInputStream(bs); ObjectInputStream inputStream = new ObjectInputStream(bis); Person readObject = (Person) inputStream.readObject(); System.out.println(" read object \t" + readObject.toString()); inputStream.close(); bis.close(); redis.disconnect(); } }
此外,我还讨论过较为常见的基于服务器的数据存储,比如 MongoDB 和 CouchDB。每个数据存储都有其优势和劣势,特别是当应用于特定领域时。 本期的 Java 开发 2.0 关注的是 Redis,一种轻量级键值对数据存储。多数 NoSQL 实现本质上都是键值对,但是 Redis 支持非常丰富的值集,其中包括字符串、列表、集以及散列。因此,Redis 通常被称为数据结构服务器。Redis 也以异常快速而闻名,这使得它成为某一特定类型使用案例的最优选择。 当我们想要了解一种新事物时,将其同熟知的事物进行比较可能会有所帮助,因此,我们将通过对比其与 memcached 的相似性以开启 Redis 探索之旅。接着我们将介绍 Redis 的主要功能,这些功能可以使其在某些应用场景可以胜过 memcached。最后我将向您展示如何将 Redis 作为一个传统数据存储用于模型对象。Redis 和 memcached Memcached 是一个众所周知的内存对象缓存系统,通过将目标键和值导入内存缓存运行。因此,Memcached 能回避读取磁盘时发生的 I/O 成本问题。在 Web 应用程序和数据库之间粘贴 memcached 时会产生更好的读取性能。因此,对于那些需要快速数据查询的应用程序,Memcached 是一个不错的选择。其中的一个例子为股票查询服务,需要另外访问数据库获取相对静态数据,如股票名称或价格信息。 MemcacheDB 将Redis 与 memcached 相比较并不公平,它与 MemcacheDB 相比要好的多,MemcacheDB 是一个分布式键值对存储系统,专为数据持久化而设计。MemcacheDB 与 Redis 较为相似,其新增优势可以使其轻松地与 memcached 实现的客户端进行通信。 但是memcached 也有其局限性,其中一个事实就是它所有的值均是简单的字符串。Redis 作为 memcached 的替代者,支持更加丰富的功能集。一些基准 (benchmarks) 也表明 Redis 的速度要比 memcached 快很多。Redis 提供的丰富数据类型使其可以在内存中存储更为复杂的数据,这是使用 memcached 无法实现的。同 memcached 不一样,Redis 可以持久化其数据。 Redis 解决了一个重大的缓存问题,而其丰富的功能集又为其找到了其他用途。由于 Redis 能够在磁盘上存储数据以及跨节点复制数据,因而可以作为数据仓库用于传统数据模式(也就是说,您可以使用 Redis,就像使用 RDBMS 一样)。Redis 还经常被用作队列系统。在本用例中,Redis 是备份和工作队列持久化存储(利用 Redis 的列表类型)的基础。GitHub 是以此种方法使用 Redis 的大规模基础架构示例准备好 Redis,立即开始! 要开始使用 Redis,您需要访问它,可以通过本地安装或者托管供应商来实现访问。如果您使用的 MAC,安装过程可能就不那么简单。如果您使用的是 Windows??,您需要先安装 Cygwin。如果您正在寻找一个托管供应商,Redis4You 拥有一个免费计划。不管您以何种方式访问,您都能够根据本文下列示例进行操作,但是我需要指出的是,使用一个托管供应商进行缓存可能并不是很好的缓存解决方案,因为网络延迟可能会抵消任何性能优势。 您需要通过命令与 Redis 进行交互,这就是说,这里没有 SQL 类查询语言。使用 Redis 工作非常类似于使用传统 map 数据结构,即所有的......余下全文>>
建议你使用java的redis 客户端进行操作
github.com/xetorthio/jedis