redis 的使用
来源:互联网 发布:大一c语言编程四则运算 编辑:程序博客网 时间:2024/06/08 12:20
普通操作
- 连接redis数据库
Jedis jedis = new Jedis("192.168.0.23", 6379);
- 权限验证
jedis.auth("jerryhudingda");//jerryhudingda为密码
- 存储字符串
jedis.set("name","jerry");//普通键值对 jedis.append("name", " is so cool"); //字符串拼接 jedis.del("name"); //删除某个键 jedis.mset("name","jerry","age","28","qq","39577****");//设置多个键值对 jedis.incr("age"); //进行加1操作
- MAP存储
//-----添加数据---------- Map<String, String> map = new HashMap<String, String>(); map.put("name", "xinxin"); map.put("age", "22"); map.put("qq", "123456"); jedis.hmset("user",map); //取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List //第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数 List<String> rsmap = jedis.hmget("user", "name", "age", "qq"); System.out.println(rsmap); //删除map中的某个键值 jedis.hdel("user","age"); System.out.println(jedis.hmget("user", "age")); //因为删除了,所以返回的是null System.out.println(jedis.hlen("user")); //返回key为user的键中存放的值的个数2 System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回true System.out.println(jedis.hkeys("user"));//返回map对象中的所有key System.out.println(jedis.hvals("user"));//返回map对象中的所有value Iterator<String> iter=jedis.hkeys("user").iterator(); while (iter.hasNext()){ String key = iter.next(); System.out.println(key+":"+jedis.hmget("user",key)); }
- jedis操作List(list 和set 有共同的父类 它们的用法也是一样的 唯一的就是set中不能有相同的元素 list中可以)
//开始前,先移除所有的内容 jedis.del("java framework"); System.out.println(jedis.lrange("java framework",0,-1)); //先向key java framework中存放三条数据 jedis.lpush("java framework","spring"); jedis.lpush("java framework","struts"); jedis.lpush("java framework","hibernate"); //再取出所有数据jedis.lrange是按范围取出, // 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有 System.out.println(jedis.lrange("java framework",0,-1)); jedis.del("java framework"); jedis.rpush("java framework","spring"); jedis.rpush("java framework","struts"); jedis.rpush("java framework","hibernate"); System.out.println(jedis.lrange("java framework",0,-1));
- 操作set
//开始前,先移除所有的内容jedis.del("user");//添加jedis.sadd("user","liuling");jedis.sadd("user","xinxin");jedis.sadd("user","ling");jedis.sadd("user","zhangxinxin");jedis.sadd("user","who");//移除nonamejedis.srem("user","who");System.out.println(jedis.smembers("user"));//获取所有加入的valueSystem.out.println(jedis.sismember("user", "who"));//判断 who 是否是user集合的元素System.out.println(jedis.srandmember("user"));System.out.println(jedis.scard("user"));//返回集合的元素个数
- 实体对象
User user = new User();user.setId(123); user.setName("fighter"); // 存入一个 user对象 jedis.set("user".getBytes(), SerializationUtil.serialize(user)); // 获取 byte[] bs = jedis.get("user".getBytes()); User desUser = (User) SerializationUtil.deserialize(bs); System.out.println(desUser.getId() + ":" + desUser.getName());
/** * 序列化就是将一个对象转换为二进制的数据流。这样就可以进行传输,或者保存到文件中。如果一个类的对象要想实现序列化,就必须实现serializable接口。在此接口中没有任何的方法,此接口只是作为一个标识,表示本类的对象具备了序列化的能力而已。 * 反序列化:将二进制数据流转换成相应的对象。 * 如果想要完成对象的序列化,则还要依靠ObjectOutputStream和ObjectInputStream,前者属于序列化操作,而后者属于反序列化操作。 * */import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class SerializationUtil { /** * 序列化 * * @param object * @return */ 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) { } return null; } /** * 反序列化 * * @param bytes * @return */ public static Object deserialize(byte[] bytes) { ByteArrayInputStream bais = null; try { bais = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } catch (Exception e) { } return null; }}
事务操作
redis的事务很简单,他主要目的是保障,一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。
long start = System.currentTimeMillis();Transaction tx = jedis.multi(); for (int i = 0; i < 100000; i++) { tx.set("t" + i, "t" + i); } List<Object> results = tx.exec(); long end = System.currentTimeMillis(); System.out.println("Transaction SET: " + ((end - start)/1000.0) + " seconds"); jedis.disconnect();
管道操作
有时,我们需要采用异步方式,一次发送多个指令,不同步等待其返回结果。这样可以取得非常好的执行效率。
Pipeline pipeline = jedis.pipelined(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { pipeline.set("p" + i, "p" + i); } List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds"); jedis.disconnect();
管道中调用事务
jedis = new Jedis("localhost"); long start = System.currentTimeMillis(); Pipeline pipeline = jedis.pipelined(); pipeline.multi(); for (int i = 0; i < 100000; i++) { pipeline.set("" + i, "" + i); } pipeline.exec(); List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); System.out.println("Pipelined transaction: " + ((end - start)/1000.0) + " seconds"); jedis.disconnect();
分布式直连同步调用
List<JedisShardInfo> shards = Arrays.asList( new JedisShardInfo("localhost",6379), new JedisShardInfo("localhost",6380)); ShardedJedis sharding = new ShardedJedis(shards); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { String result = sharding.set("sn" + i, "n" + i); } long end = System.currentTimeMillis(); System.out.println("Simple@Sharing SET: " + ((end - start)/1000.0) + " seconds"); sharding.disconnect();
分布式直连异步调用
List<JedisShardInfo> shards = Arrays.asList( new JedisShardInfo("localhost",6379), new JedisShardInfo("localhost",6380)); ShardedJedis sharding = new ShardedJedis(shards); ShardedJedisPipeline pipeline = sharding.pipelined(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { pipeline.set("sp" + i, "p" + i); } List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); System.out.println("Pipelined@Sharing SET: " + ((end - start)/1000.0) + " seconds"); sharding.disconnect();
分布式连接池同步调用
如果,你的分布式调用代码是运行在线程中,那么上面两个直连调用方式就不合适了,因为直连方式是非线程安全的,这个时候,你就必须选择连接池调用
List<JedisShardInfo> shards = Arrays.asList( new JedisShardInfo("localhost",6379), new JedisShardInfo("localhost",6380)); ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards); ShardedJedis one = pool.getResource(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { String result = one.set("spn" + i, "n" + i); } long end = System.currentTimeMillis(); pool.returnResource(one); System.out.println("Simple@Pool SET: " + ((end - start)/1000.0) + " seconds"); pool.destroy();
分布式连接池异步调用
List<JedisShardInfo> shards = Arrays.asList( new JedisShardInfo("localhost",6379), new JedisShardInfo("localhost",6380)); ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards); ShardedJedis one = pool.getResource(); ShardedJedisPipeline pipeline = one.pipelined(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { pipeline.set("sppn" + i, "n" + i); } List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); pool.returnResource(one); System.out.println("Pipelined@Pool SET: " + ((end - start)/1000.0) + " seconds"); pool.destroy();
需要注意的地方
- 事务和管道都是异步模式。在事务和管道中不能同步查询结果。比如下面两个调用,都是不允许的
- 事务和管道都是异步的,个人感觉,在管道中再进行事务调用,没有必要,不如直接进行事务模式。
- 分布式中,连接池的性能比直连的性能略好(见后续测试部分)
- 分布式调用中不支持事务:因为事务是在服务器端实现,而在分布式中,每批次的调用对象都可能访问不同的机器,所以,没法进行事务。
redis 保存session
我们知道session其实是在cookie中保存了一个sessionid,用户每次访问都将sessionid发给服务器,服务器通过ID查找用户对应的状态数据。
因此我们要 写 HttpSession 的实现类 并且关联sessionid 榆次同时 每次调用HttpSession接口的方法就刷新redis的生命周期(采用动态代理执行时调用session.setLifeCycleTime();)
1 0
- redis--2--redis的使用
- redis的内存使用
- Redis的使用
- Redis 的使用
- php redis的使用
- redis pipeline的使用
- redis的使用
- redis 的使用
- redis的基本使用
- redis的使用
- Redis 的使用
- Redis浅显的使用
- redis的使用
- Redis的使用
- redis spring的使用
- mybatis-redis的使用
- Redis的使用
- redis的简单使用
- PullToRefresh
- 算法003-插入排序
- ubuntu14.04下安装flash
- Js_Function
- live555源码分析----H264的数据处理
- redis 的使用
- Behavior Designer-行为树和有限状态机
- Spring ioc(Inversion of Control )
- leetcode(E) two sum
- TextView实现多处不同点击事件
- mvc的控制器
- python-bytestring与unicodestring
- CSS让内部容器高度随着父容器高度变化的解决办法
- linux命令总结mount