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
原创粉丝点击