redis 的使用

普通操作

  • 连接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");
//移除noname
jedis.srem("user","who");
System.out.println(jedis.smembers("user"));//获取所有加入的value
System.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值