设为首页 收藏本站
查看: 1021|回复: 0

[经验分享] redis相关知识积累

[复制链接]

尚未签到

发表于 2018-11-3 15:13:13 | 显示全部楼层 |阅读模式
@Test  
    public void jedisTest() {
  
    System.out.println("**************************");
  
        Jedis jedis = jedis();
  

  
        jedis.lpush("meineprivateliste", UUID.randomUUID().toString()); //向key meineprivateliste中存放一个字符串
  
        System.out.println(jedis.lrange("meineprivateliste", 0, -1)); //第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有
  

  
        /*
  
         * 参与自: http://blog.csdn.net/liyantianmin/article/details/51613772
  事务是保证事务内的所有命令是原子操作,一般配合watch使用,事务的执行结果和pipeline一样都是采用异步的方式获取结果,multi.exec()提交事务,
  如果执行成功,其返回的结果和pipeline一样是所有命令的返回值,如果事务里面有两个命令那么事务的exec返回值会把两个命令的返回值组合在一起返回。如果事务被取消返回null。
  3、watch
  一般是和事务一起使用,当对某个key进行watch后如果其他的客户端对这个key进行了更改,那么本次事务会被取消,事务的exec会返回null。jedis.watch(key)都会返回OK
  https://my.oschina.net/sphl520/blog/312514
  我们调用jedis.watch(…)方法来监控key,如果调用后key值发生变化,则整个事务会执行失败。另外,事务中某个操作失败,并不会回滚其他操作。这一点需要注意。还有,我们可以使用discard()方法来取消事务。
  
         * */
  
        jedis.watch("foo");
  
        Transaction t = jedis.multi();
  
        /*
  
         * set是PipelineBase里的方法
  
         * Transaction extends MultiKeyPipelineBase,MultiKeyPipelineBase又extends PipelineBase
  
         *
  public Response set(String key, String value) {
  getClient(key).set(key, value);
  return getResponse(BuilderFactory.STRING);
  }
  public Response set(byte[] key, byte[] value) {
  getClient(key).set(key, value);
  return getResponse(BuilderFactory.STRING);
  }
  
         * */
  
        t.set("foo", "bar");
  
        /*
  
         * get是PipelineBase里的方法
  
         * Transaction extends MultiKeyPipelineBase,MultiKeyPipelineBase又extends PipelineBase
  
         *
  public Response get(String key) {
  getClient(key).get(key);
  return getResponse(BuilderFactory.STRING);
  }
  public Response get(byte[] key) {
  getClient(key).get(key);
  return getResponse(BuilderFactory.BYTE_ARRAY);
  }
  
         * */
  
        Response resp = t.get("foo");
  
        t.exec();
  
        /*
  
        public T get() {
  // if response has dependency response and dependency is not built,
  // build it first and no more!!
  if (dependency != null && dependency.set && !dependency.built) {
  dependency.build();
  }
  if (!set) {
  throw new JedisDataException(
  "Please close pipeline or multi block before calling this method.");
  }
  if (!built) {
  build();
  }
  if (exception != null) {
  throw exception;
  }
  return response;
  }
  
         * */
  
        System.out.println(resp.get());
  

  
        /*
  
         * http://www.blogjava.net/masfay/archive/2012/07/03/382080.html
  
         * 开启事务,当server端收到multi指令
  
         * 会将该client的命令放入一个队列,然后依次执行,知道(应该是直到)收到exec指令
  
         * */
  
        t = jedis.multi();
  
        int[] positions = new int[]{1, 2, 3};
  
        for (int position : positions)
  
            t.getbit("bla", position);
  
        for (Object obj : t.exec()) {
  
            System.out.println("Bit : " + (Boolean) obj);
  
        }
  

  
        jedis.set("meinint", Integer.toString(3));
  
        /*
  
         *源自http://www.redis.cn/commands/incr.html
  
         * 对存储在指定key的数值执行原子的加1操作。
  
如果指定的key不存在,那么在执行incr操作之前,会先将它的值设定为0。
  
如果指定的key中存储的值不是字符串类型(fix:)或者存储的字符串类型不能表示为一个整数,
  
那么执行这个命令时服务器会返回一个错误(eq:(error) ERR value is not an integer or out of range)。
  
这个操作仅限于64位的有符号整型数据。
  
注意: 由于redis并没有一个明确的类型来表示整型数据,所以这个操作是一个字符串操作。
  
执行这个操作的时候,key对应存储的字符串被解析为10进制的64位有符号整型数据。
  
事实上,Redis 内部采用整数形式(Integer representation)来存储对应的整数值,所以对该类字符串值实际上是用整数保存,也就不存在存储整数的字符串表示(String representation)所带来的额外消耗。
  
         * */
  
        jedis.incr("meinint");
  
        int meinint = Integer.valueOf(jedis.get("meinint"));
  
        System.out.println("Integer: " + meinint);
  

  
        /*
  
         *
  
设置或者清空key的value(字符串)在offset处的bit值。
  
那个位置的bit要么被设置,要么被清空,这个由value(只能是0或者1)来决定。
  
当key不存在的时候,就创建一个新的字符串value。要确保这个字符串大到在offset处有bit值。参数offset需要大于等于0,并且小于232(限制bitmap大小为512)。当key对应的字符串增大的时候,新增的部分bit值都是设置为0。
  
警告:当set最后一个bit(offset等于232-1)并且key还没有一个字符串value或者其value是个比较小的字符串时,Redis需要立即分配所有内存,这有可能会导致服务阻塞一会。在一台2010MacBook Pro上,offset为232-1(分配512MB)需要~300ms,offset为230-1(分配128MB)需要~80ms,offset为228-1(分配32MB)需要~30ms,offset为226-1(分配8MB)需要8ms。注意,一旦第一次内存分配完,后面对同一个key调用SETBIT就不会预先得到内存分配。
  
         * */
  
        jedis.setbit("testbits", 100, true);
  
        System.out.println("***********************");
  
        System.out.println("wtf"+jedis.get("testbits"));
  
        System.out.println(Arrays.toString(jedis.get(SafeEncoder.encode("testbits"))));
  

  
        jedis.watch("test");
  
        if (!jedis.exists("test")) {
  
            Transaction ta = jedis.multi();
  
            ta.setbit("test", 100000, false);
  
            ta.exec();
  
        }
  

  
        Transaction ta = jedis.multi();
  
        ta.setbit("test", 10, true);
  
        ta.exec();
  

  
        ta = jedis.multi();
  
        for (int i = 0; i

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-630357-1-1.html 上篇帖子: Redis 为什么使用单进程单线程方式也这么快 下篇帖子: redis安装和基本使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表