今天给各位分享javaredishmget的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、java web开发缓存方案,ehcache和redis哪个更好2、如何用Java和Redis设计一个高效的先入先出的队列3、java 监听redis map是否有修改4、Java如何获取Redis中存储的大量内容?5、redis raw用java怎么使用
java web开发缓存方案,ehcache和redis哪个更好
Ehcache
在java项目广泛的使用。它是一个开源的、设计于提高在数据从RDBMS中取出来的高花费、高延迟采取的一种缓存方案。正因为Ehcache具有健壮性(基于java开发)、被认证(具有apache 2.0 license)、充满特色(稍后会详细介绍),所以被用于大型复杂分布式web application的各个节点中。
1. 够快
Ehcache的发行有一段时长了,经过几年的努力和不计其数的性能测试,Ehcache终被设计于large, high concurrency systems.
2. 够简单
开发者提供的接口非常简单明了,从Ehcache的搭建到运用运行仅仅需要的是你宝贵的几分钟。其实很多开发者都不知道自己用在用Ehcache,Ehcache被广泛的运用于其他的开源项目
比如:hibernate
3.够袖珍
关于这点的特性,官方给了一个很可爱的名字small foot print ,一般Ehcache的发布版本不会到2M,V 2.2.3 才 668KB。
4. 够轻量
核心程序仅仅依赖slf4j这一个包,没有之一!
5.好扩展
Ehcache提供了对大数据的内存和硬盘的存储,最近版本允许多实例、保存对象高灵活性、提供LRU、LFU、FIFO淘汰算法,基础属性支持热配置、支持的插件多
6.监听器
缓存管理器监听器 (CacheManagerListener)和 缓存监听器(CacheEvenListener),做一些统计或数据一致性广播挺好用的
如何使用?
够简单就是Ehcache的一大特色,自然用起来just so easy!
redis
redis是在memcache之后编写的,大家经常把这两者做比较,如果说它是个key-value store 的话但是它具有丰富的数据类型,我想暂时把它叫做缓存数据流中心,就像现在物流中心那样,order、package、store、classification、distribute、end。现在还很流行的LAMP PHP架构 不知道和 redis+mysql 或者 redis + mongodb的性能比较(听群里的人说mongodb分片不稳定)。
先说说reidis的特性
1. 支持持久化
redis的本地持久化支持两种方式:RDB和AOF。RDB 在redis.conf配置文件里配置持久化触发器,AOF指的是redis没增加一条记录都会保存到持久化文件中(保存的是这条记录的生成命令),如果不是用redis做DB用的话还会不要开AOF ,数据太庞大了,重启恢复的时候是一个巨大的工程!
2.丰富的数据类型
redis 支持 String 、Lists、sets、sorted sets、hashes 多种数据类型,新浪微博会使用redis做nosql主要也是它具有这些类型,时间排序、职能排序、我的微博、发给我的这些功能List 和 sorted set 的强大操作功能息息相关
3.高性能
这点跟memcache很想象,内存操作的级别是毫秒级的比硬盘操作秒级操作自然高效不少,较少了磁头寻道、数据读取、页面交换这些高开销的操作!这也是NOSQL冒出来的原因吧,应该是高性能
是基于RDBMS的衍生产品,虽然RDBMS也具有缓存结构,但是始终在app层面不是我们想要的那么操控的。
4.replication
redis提供主从复制方案,跟mysql一样增量复制而且复制的实现都很相似,这个复制跟AOF有点类似复制的是新增记录命令,主库新增记录将新增脚本发送给从库,从库根据脚本生成记录,这个过程非常快,就看网络了,一般主从都是在同一个局域网,所以可以说redis的主从近似及时同步,同事它还支持一主多从,动态添加从库,从库数量没有限制。 主从库搭建,我觉得还是采用网状模式,如果使用链式(master-slave-slave-slave-slave·····)如果第一个slave出现宕机重启,首先从master 接收 数据恢复脚本,这个是阻塞的,如果主库数据几TB的情况恢复过程得花上一段时间,在这个过程中其他的slave就无法和主库同步了。
5.更新快
这点好像从我接触到redis到目前为止 已经发了大版本就4个,小版本没算过。redis作者是个非常积极的人,无论是邮件提问还是论坛发帖,他都能及时耐心的为你解答,维护度很高。有人维护的话,让我们用的也省心和放心。目前作者对redis 的主导开发方向是redis的集群方向。
所以如果希望简单就用ehcache,如果开发任务比较复杂,希望得到比较多的支持什么的就redis
如何用Java和Redis设计一个高效的先入先出的队列
分析:
redis的list底层是多个ziplist结构组成的“双向”链表。中间部分还压缩了一下。
最外层是由两个哈希表构成的dict。
哈希表的get(key)时间复杂度为O(1),而且这个O(1)理论上不会因为所占内存的大小和元素数目所改变。list的出队列和入队操作也都是O(1)。
Java的队列时间复杂度也应为O(1)。
可不可以直接用redis的list做先进先出?
情况1,数据数量不多,可以用
情况2,数据量多,但存的数据是激活码这样简单值一类,可以用。
情况3,list存的是要获取数据的索引,大量数据的值已经存在redis的KV结构中。
这时候,如果数据每次获取下一个数据都要执行redis的hash查找(O(1))然后redis的list从头或者末尾出一个。经过网络IO返回,Java程序在用出来的key去请求redis去get(key) (O(1))。这里是两次网络IO或者进程间的IO。
这时候,可以不用redis的list存索引而只是用redis大的KV哈希结构存键值。用①Java的队列先进先出获取下一个key或者②使用预先规定好的键生成的规则,让键是有规则有顺序的,比如自增ID,然后每次获取都是ID++,而直接从redis.get(ID.next());来获取值。
最后一种就是最高效的办法,为了特殊场景的高效出队列而设计。但是如果只是一般的数据量,使用redis的list也未尝不可。
java 监听redis map是否有修改
/**
* @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
MapString,String user = new HashMapString,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字段值
ListString 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();
}
}
Java如何获取Redis中存储的大量内容?
1、如果key, field都是已知的,可以用hmget循环批量的获取hash的值,保证一次获取的数据不会太多而导致OOM;
2、使用HSCAN 迭代哈希键中的键值对;
最后,hash的HGETALL在生产环境一定要慎用啊!!
redis raw用java怎么使用
package com.test;
2
3 import java.util.HashMap;
4 import java.util.Iterator;
5 import java.util.List;
6 import java.util.Map;
7
8 import org.junit.Before;
9 import org.junit.Test;
10
11 import redis.clients.jedis.Jedis;
12
13 public class TestRedis {
14 private Jedis jedis;
15
16 @Before
17 public void setup() {
18 //连接redis服务器,192.168.0.100:6379
19 jedis = new Jedis(“192.168.0.100”, 6379);
20 //权限认证
21 jedis.auth(“admin”);
22 }
23
24 /**
25 * redis存储字符串
26 */
27 @Test
28 public void testString() {
29 //—–添加数据———-
30 jedis.set(“name”,”xinxin”);//向key–name中放入了value–xinxin
31 System.out.println(jedis.get(“name”));//执行结果:xinxin
32
33 jedis.append(“name”, ” is my lover”); //拼接
34 System.out.println(jedis.get(“name”));
35
36 jedis.del(“name”); //删除某个键
37 System.out.println(jedis.get(“name”));
38 //设置多个键值对
39 jedis.mset(“name”,”liuling”,”age”,”23″,”qq”,”476777XXX”);
40 jedis.incr(“age”); //进行加1操作
41 System.out.println(jedis.get(“name”) + “-” + jedis.get(“age”) + “-” + jedis.get(“qq”));
42
43 }
44
45 /**
46 * redis操作Map
47 */
48 @Test
49 public void testMap() {
50 //—–添加数据———-
51 MapString, String map = new HashMapString, String();
52 map.put(“name”, “xinxin”);
53 map.put(“age”, “22”);
54 map.put(“qq”, “123456”);
55 jedis.hmset(“user”,map);
56 //取出user中的name,执行结果:[minxr]–注意结果是一个泛型的List
57 //第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数
58 ListString rsmap = jedis.hmget(“user”, “name”, “age”, “qq”);
59 System.out.println(rsmap);
60
61 //删除map中的某个键值
62 jedis.hdel(“user”,”age”);
63 System.out.println(jedis.hmget(“user”, “age”)); //因为删除了,所以返回的是null
64 System.out.println(jedis.hlen(“user”)); //返回key为user的键中存放的值的个数2
65 System.out.println(jedis.exists(“user”));//是否存在key为user的记录 返回true
66 System.out.println(jedis.hkeys(“user”));//返回map对象中的所有key
67 System.out.println(jedis.hvals(“user”));//返回map对象中的所有value
68
69 IteratorString iter=jedis.hkeys(“user”).iterator();
70 while (iter.hasNext()){
71 String key = iter.next();
72 System.out.println(key+”:”+jedis.hmget(“user”,key));
关于javaredishmget和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。