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

[经验分享] redis中各种数据类型对应的jedis操作命令

[复制链接]

尚未签到

发表于 2015-11-12 11:05:20 | 显示全部楼层 |阅读模式
  一、常用数据类型简介:
        redis常用五种数据类型:string,hash,list,set,zset(sorted set).
  1.String类型
  String是最简单的类型,一个key对应一个value
String类型的数据最大1G。
String类型的值可以被视作integer,从而可以让“INCR”命令族操作(incrby、decr、decrby),这种情况下,该integer的值限制在64位有符号数。  在list、set和zset中包含的独立的元素类型都是Redis String类型。
  2.List类型
  链表类型,主要功能是push、pop、获取一个范围的所有值等。其中的key可以理解为链表的名字。
  在Redis中,list就是Redis String的列表,按照插入顺序排序。比如使用LPUSH命令在list头插入一个元素,使用RPUSH命令在list的尾插入一个元素。当这两个命令之一作用于一个空的key时,一个新的list就创建出来了。
  List的最大长度是2^32-1个元素。
  3.Set类型
  集合,和数学中的集合概念相似。操作中的key理解为集合的名字。
  在Redis中,set就是Redis String的无序集合,不允许有重复元素。
  Set的最大元素数是2^32-1。
  Redis中对set的操作还有交集、并集、差集等。
  4.ZSet(Sorted Set)类型
  Zset是set的一个升级版本,在set的基础上增加了一个顺序属性,这一属性在添加修改元素时可以指定,每次指定后zset会自动安装指定值重新调整顺序。可以理解为一张表,一列存value,一列存顺序。操作中的key理解为zset的名字。
  Zset的最大元素数是2^32-1。
  对于已经有序的zset,仍然可以使用SORT命令,通过指定ASC|DESC参数对其进行排序。
  5.hash类型
  hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中。
  二、jedis操作命令:
  1.对value操作的命令
       exists(key):确认一个key是否存在
       del(key):删除一个key
       type(key):返回值的类型
       keys(pattern):返回满足给定pattern的所有key
       randomkey:随机返回key空间的一个key
       rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key
       dbsize:返回当前数据库中key的数目
       expire:设定一个key的活动时间(s)
       ttl:获得一个key的活动时间
       select(index):按索引查询
       move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库
       flushdb:删除当前选择数据库中的所有key
       flushall:删除所有数据库中的所有key
  2.对String操作的命令
       set(key, value):给数据库中名称为key的string赋予值value
       get(key):返回数据库中名称为key的string的value
       getset(key, value):给名称为key的string赋予上一次的value
       mget(key1, key2,…, key N):返回库中多个string(它们的名称为key1,key2…)的value
       setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value
       setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时间time
       mset(key1, value1, key2, value2,…key N, value N):同时给多个string赋值,名称为key i的string赋值value i
       msetnx(key1, value1, key2, value2,…key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,名称           key i赋值为value i
       incr(key):名称为key的string增1操作
       incrby(key, integer):名称为key的string增加integer
       decr(key):名称为key的string减1操作
       decrby(key, integer):名称为key的string减少integer
       append(key, value):名称为key的string的值附加value
       substr(key, start, end):返回名称为key的string的value的子串
  3.对List操作的命令
       rpush(key, value):在名称为key的list尾添加一个值为value的元素
       lpush(key, value):在名称为key的list头添加一个值为value的 元素
       llen(key):返回名称为key的list的长度
       lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下同)
       ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素
       lindex(key, index):返回名称为key的list中index位置的元素
       lset(key, index, value):给名称为key的list中index位置的元素赋值为value
       lrem(key, count, value):删除count个名称为key的list中&#20540;为value的元素。count为0,删除所有&#20540;为value的元素,count>0      从头至尾删除count个&#20540;为value的元素,count<0从尾到头删除|count|个&#20540;为value的元素。
       lpop(key):返回并删除名称为key的list中的首元素
       rpop(key):返回并删除名称为key的list中的尾元素
       blpop(key1, key2,… key N, timeout):lpop命令的block版本。即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。如果timeout>0,则遇到上述情况时,等待timeout秒,如果问题没有解决,则对key i&#43;1开始的list执行pop操作。
       brpop(key1, key2,… key N, timeout):rpop的block版本。参考上一命令。
       rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
  4.对Set操作的命令
       sadd(key, member):向名称为key的set中添加元素member
       srem(key, member) :删除名称为key的set中的元素member
       spop(key) :随机返回并删除名称为key的set中一个元素
       smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合
       scard(key) :返回名称为key的set的基数
       sismember(key, member) :测试member是否是名称为key的set的元素
       sinter(key1, key2,…key N) :求交集
       sinterstore(dstkey, key1, key2,…key N) :求交集并将交集保存到dstkey的集合
       sunion(key1, key2,…key N) :求并集
       sunionstore(dstkey, key1, key2,…key N) :求并集并将并集保存到dstkey的集合
       sdiff(key1, key2,…key N) :求差集
       sdiffstore(dstkey, key1, key2,…key N) :求差集并将差集保存到dstkey的集合
       smembers(key) :返回名称为key的set的所有元素
       srandmember(key) :随机返回名称为key的set的一个元素
  5.对zset(sorted set)操作的命令
       zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。
       zrem(key, member) :删除名称为key的zset中的元素member
       zincrby(key, increment, member) :如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的&#20540;为increment
       zrank(key, member) :返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”
       zrevrank(key, member) :返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”
       zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素
       zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素
       zrangebyscore(key, min, max):返回名称为key的zset中score >= min且score <= max的所有元素
       zcard(key):返回名称为key的zset的基数
       zscore(key, element):返回名称为key的zset中元素element的score
       zremrangebyrank(key, min, max):删除名称为key的zset中rank >= min且rank <= max的所有元素
       zremrangebyscore(key, min, max) :删除名称为key的zset中score >= min且score <= max的所有元素
       zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素的score是所有集合对应元素进行SUM运算的&#20540;,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小&#20540;和最大&#20540;。
  6.对Hash操作的命令
       hset(key, field, value):向名称为key的hash中添加元素field<—>value
       hget(key, field):返回名称为key的hash中field对应的value
       hmget(key, field1, …,field N):返回名称为key的hash中field i对应的value
       hmset(key, field1, value1,…,field N, value N):向名称为key的hash中添加元素field i<—>value i
       hincrby(key, field, integer):将名称为key的hash中field的value增加integer
       hexists(key, field):名称为key的hash中是否存在键为field的域
       hdel(key, field):删除名称为key的hash中键为field的域
       hlen(key):返回名称为key的hash中元素个数
       hkeys(key):返回名称为key的hash中所有键
       hvals(key):返回名称为key的hash中所有键对应的value
       hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
  三、各种数据类型所对应的应用场景
  1.String类型的应用场景
     String是最常用的一种数据类型,普通的key/value存储.
  2.list类型的应用场景
     比较适用于列表式存储且顺序相对比较固定,例如:
  省份、城市列表
  品牌、厂商、车系、车型等列表
  拆车坊专题列表...
  3.set类型的应用场景
     Set对外提供的功能与list类&#20284;,当需要存储一个列表数据,又不希望出现重复数据时,可选用set
  4.zset(sorted set)类型的应用场景
  zset的使用场景与set类&#20284;,区别是set不是自动有序的,而zset可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序.当你需要一个有序的并且不重复的集合列表,那么可以选择zset数据结构。例如:
  根据PV排序的热门车系车型列表
  根据时间排序的新闻列表
  5.hash类型的应用场景
  类&#20284;于表记录的存储
  页面视图所需数据的存储
  四、具体使用参考示例:
    private void testKey() {
        System.out.println(&quot;=============key==========================&quot;);
        // 清空数据
        System.out.println(jedis.flushDB());
        System.out.println(jedis.echo(&quot;foo&quot;));
        // 判断key否存在
        System.out.println(shardedJedis.exists(&quot;foo&quot;));
        shardedJedis.set(&quot;key&quot;, &quot;values&quot;);
        System.out.println(shardedJedis.exists(&quot;key&quot;));
    }

    private void testString() {
        System.out.println(&quot;=============String==========================&quot;);
        // 清空数据
        System.out.println(jedis.flushDB());
        // 存储数据
        shardedJedis.set(&quot;foo&quot;, &quot;bar&quot;);
        System.out.println(shardedJedis.get(&quot;foo&quot;));
        // 若key不存在,则存储
        shardedJedis.setnx(&quot;foo&quot;, &quot;foo not exits&quot;);
        System.out.println(shardedJedis.get(&quot;foo&quot;));
        // 覆盖数据
        shardedJedis.set(&quot;foo&quot;, &quot;foo update&quot;);
        System.out.println(shardedJedis.get(&quot;foo&quot;));
        // 追加数据
        shardedJedis.append(&quot;foo&quot;, &quot; hello, world&quot;);
        System.out.println(shardedJedis.get(&quot;foo&quot;));
        // 设置key的有效期,并存储数据
        shardedJedis.setex(&quot;foo&quot;, 2, &quot;foo not exits&quot;);
        System.out.println(shardedJedis.get(&quot;foo&quot;));
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
        }
        System.out.println(shardedJedis.get(&quot;foo&quot;));
        // 获取并更改数据
        shardedJedis.set(&quot;foo&quot;, &quot;foo update&quot;);
        System.out.println(shardedJedis.getSet(&quot;foo&quot;, &quot;foo modify&quot;));
        // 截取value的&#20540;
        System.out.println(shardedJedis.getrange(&quot;foo&quot;, 1, 3));
        System.out.println(jedis.mset(&quot;mset1&quot;, &quot;mvalue1&quot;, &quot;mset2&quot;, &quot;mvalue2&quot;, &quot;mset3&quot;, &quot;mvalue3&quot;, &quot;mset4&quot;, &quot;mvalue4&quot;));
        System.out.println(jedis.mget(&quot;mset1&quot;, &quot;mset2&quot;, &quot;mset3&quot;, &quot;mset4&quot;));
        System.out.println(jedis.del(new String[] { &quot;foo&quot;, &quot;foo1&quot;, &quot;foo3&quot; }));
    }

    private void testList() {
        System.out.println(&quot;=============list==========================&quot;);
        // 清空数据
        System.out.println(jedis.flushDB());
        // 添加数据
        shardedJedis.lpush(&quot;lists&quot;, &quot;vector&quot;);
        shardedJedis.lpush(&quot;lists&quot;, &quot;ArrayList&quot;);
        shardedJedis.lpush(&quot;lists&quot;, &quot;LinkedList&quot;);
        // 数组长度
        System.out.println(shardedJedis.llen(&quot;lists&quot;));
        // 排序
        System.out.println(shardedJedis.sort(&quot;lists&quot;));
        // 字串
        System.out.println(shardedJedis.lrange(&quot;lists&quot;, 0, 3));
        // 修改列表中单个&#20540;
        shardedJedis.lset(&quot;lists&quot;, 0, &quot;hello list!&quot;);
        // 获取列表指定下标的&#20540;
        System.out.println(shardedJedis.lindex(&quot;lists&quot;, 1));
        // 删除列表指定下标的&#20540;
        System.out.println(shardedJedis.lrem(&quot;lists&quot;, 1, &quot;vector&quot;));
        // 删除区间以外的数据
        System.out.println(shardedJedis.ltrim(&quot;lists&quot;, 0, 1));
        // 列表出栈
        System.out.println(shardedJedis.lpop(&quot;lists&quot;));
        // 整个列表&#20540;
        System.out.println(shardedJedis.lrange(&quot;lists&quot;, 0, -1));

    }

    private void testSet() {
        System.out.println(&quot;=============set==========================&quot;);
        // 清空数据
        System.out.println(jedis.flushDB());
        // 添加数据
        shardedJedis.sadd(&quot;sets&quot;, &quot;HashSet&quot;);
        shardedJedis.sadd(&quot;sets&quot;, &quot;SortedSet&quot;);
        shardedJedis.sadd(&quot;sets&quot;, &quot;TreeSet&quot;);
        // 判断value是否在列表中
        System.out.println(shardedJedis.sismember(&quot;sets&quot;, &quot;TreeSet&quot;));
        ;
        // 整个列表&#20540;
        System.out.println(shardedJedis.smembers(&quot;sets&quot;));
        // 删除指定元素
        System.out.println(shardedJedis.srem(&quot;sets&quot;, &quot;SortedSet&quot;));
        // 出栈
        System.out.println(shardedJedis.spop(&quot;sets&quot;));
        System.out.println(shardedJedis.smembers(&quot;sets&quot;));
        //
        shardedJedis.sadd(&quot;sets1&quot;, &quot;HashSet1&quot;);
        shardedJedis.sadd(&quot;sets1&quot;, &quot;SortedSet1&quot;);
        shardedJedis.sadd(&quot;sets1&quot;, &quot;TreeSet&quot;);
        shardedJedis.sadd(&quot;sets2&quot;, &quot;HashSet2&quot;);
        shardedJedis.sadd(&quot;sets2&quot;, &quot;SortedSet1&quot;);
        shardedJedis.sadd(&quot;sets2&quot;, &quot;TreeSet1&quot;);
        // 交集
        System.out.println(jedis.sinter(&quot;sets1&quot;, &quot;sets2&quot;));
        // 并集
        System.out.println(jedis.sunion(&quot;sets1&quot;, &quot;sets2&quot;));
        // 差集
        System.out.println(jedis.sdiff(&quot;sets1&quot;, &quot;sets2&quot;));
    }

    private void testSortedSet() {
        System.out.println(&quot;=============zset==========================&quot;);
        // 清空数据
        System.out.println(jedis.flushDB());
        // 添加数据
        shardedJedis.zadd(&quot;zset&quot;, 10.1, &quot;hello&quot;);
        shardedJedis.zadd(&quot;zset&quot;, 10.0, &quot;:&quot;);
        shardedJedis.zadd(&quot;zset&quot;, 9.0, &quot;zset&quot;);
        shardedJedis.zadd(&quot;zset&quot;, 11.0, &quot;zset!&quot;);
        // 元素个数
        System.out.println(shardedJedis.zcard(&quot;zset&quot;));
        // 元素下标
        System.out.println(shardedJedis.zscore(&quot;zset&quot;, &quot;zset&quot;));
        // 集合子集
        System.out.println(shardedJedis.zrange(&quot;zset&quot;, 0, -1));
        // 删除元素
        System.out.println(shardedJedis.zrem(&quot;zset&quot;, &quot;zset!&quot;));
        System.out.println(shardedJedis.zcount(&quot;zset&quot;, 9.5, 10.5));
        // 整个集合&#20540;
        System.out.println(shardedJedis.zrange(&quot;zset&quot;, 0, -1));
    }

    private void testHash() {
        System.out.println(&quot;=============hash==========================&quot;);
        // 清空数据
        System.out.println(jedis.flushDB());
        // 添加数据
        shardedJedis.hset(&quot;hashs&quot;, &quot;entryKey&quot;, &quot;entryValue&quot;);
        shardedJedis.hset(&quot;hashs&quot;, &quot;entryKey1&quot;, &quot;entryValue1&quot;);
        shardedJedis.hset(&quot;hashs&quot;, &quot;entryKey2&quot;, &quot;entryValue2&quot;);
        // 判断某个&#20540;是否存在
        System.out.println(shardedJedis.hexists(&quot;hashs&quot;, &quot;entryKey&quot;));
        // 获取指定的&#20540;
        System.out.println(shardedJedis.hget(&quot;hashs&quot;, &quot;entryKey&quot;));        // 批量获取指定的&#20540;
        System.out.println(shardedJedis.hmget(&quot;hashs&quot;, &quot;entryKey&quot;, &quot;entryKey1&quot;));
        // 删除指定的&#20540;
        System.out.println(shardedJedis.hdel(&quot;hashs&quot;, &quot;entryKey&quot;));
        // 为key中的域 field 的&#20540;加上增量 increment
        System.out.println(shardedJedis.hincrBy(&quot;hashs&quot;, &quot;entryKey&quot;, 123l));
        // 获取所有的keys
        System.out.println(shardedJedis.hkeys(&quot;hashs&quot;));
        // 获取所有的values
        System.out.println(shardedJedis.hvals(&quot;hashs&quot;));
    }

         版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 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-138259-1-1.html 上篇帖子: redis分布式内存锁:余量扣除示例 下篇帖子: redis info命令中各个参数的含义
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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