Redis中的API应用

5 篇文章 0 订阅
5 篇文章 0 订阅
  • 数据结构---字符串《String》

  • 数据结构----哈希《hash》

  • 数据结构----列表《List》

  • 数据集合----集合《SET》

  • 数据结构----《有序集合》

  • 全局命令

 

 

1、数据结构---字符串《String》

       1.1)字符串类型:实际上可以是字符串(包括XML、JSON),还有数字(整型、浮点数),二进制(图片、音频、是视频),最大不能操作512MB

      1. 2)设置命令:set age 23 ex 10 //十秒后过期  

                               setnx age test   //不存在键name时,返回1设置成功;存在的话失败返回0

                               set age  xx         //存在age时,返回成功

                                场景:如果有多客户端同时执行setnx,只有一个能设置成功,可做分布式锁

             获值命令:get age   //存在返回value值,不存在则韩辉nil

             批量设值:mset country china city beijing

             批量获取:mget country city address  //返回china  beijing,address为nil

         若没有mget命令,则要执行n次get命令(如下图)

             使用mget=1次网络请求+redis内部n次查询(如下图)

   1.3)计数

            incr age   //必须为整数自加一,非整数返回错误,无age键从0自增返回1

            decr age //整数 age 减一 

            incrby age 2 //整数age+2

            decrby age 2 //整数age-2

            incrbyfloat score 1.1  //浮点型 score+1.1

   1.4)append 追加指令:set name hello;append name world  //追加后成helloword

   1.5)字符串长度:set hello “世界”;   strlen hello //结果6,每个中文占3个字节

   1.6)截取字符串:set name helloworld ; getrange name 2 4 //返回llo

2、数据结构----哈希《hash》

           是一个sting类型的field和value的映射表,hash特适合用于存储对象。

          以上图的指令分别是: 

                                       set user:1:name wangchl

                                       set user:1:age  18

          不难发现,用于字符串类型可以存储,但会过多占用key,浪费内存;

   可以使用hash类型存储;

                     hmset user:1 name wangchl age 18

    2.1)命令       hset key field value

             设置:hset user:1 name wangchl   //成功返回1,失败返回0

             取值:hget user:1 name  //返回wangchl

             删值:hdel user:1 age  //返回删除个数

             计算个数:hset user:1 name wangchl ;hset user age 18;

                              hlen user:1       //返回2 ,user:1有两个属性值

             批量设值hmset user:2 name wangchl james age 18 sex boy //返回OK

             批量取值:hmget user:2 name age sex  //返回三行: wangchl 18 boy

             判断field:hkeys user:2    //返回name gae sex 三个fieId

             获取user:2 所有value:hgetall user:2 //name age sex wangchl 18 boy 值

             增加  1:hincrby user:2 age 1   //age+1

             hincrbyfloat user:2 age    //浮点型加2

     2.2)应用场景

              比如吧关系型数据表转为redis存储:

使用 hash 后的存储方式为:

如果有值为NULL,那么如下:

   HASH 类型是稀疏:每个件可以有不同的filed,若用redis模拟做关系复杂查询开发困难,维护成本高

 2.3)三种方案实现用户信息存储优缺点:

     1)原生:set user:1:name wangchl

                      set user:1:age 23

                      set user:1:sex boy

             优点:简单直观,每个键对应一个值

             缺点:键数过多,占用内存多,用户信息过于分散,不用与生产环境

     2)将对象序列化存入redis

                      set user:1 serialize(userInfo);

           优点,变成简单,若使用序列化合理内存使用率高

           缺点:序列化与反序列化有一定开销,更新属性时需要把userInfo全取出来进行反序列化,更新再序列化到redis

     3)使用 hash类型

                hmset user:1 name wangchl age 18 sex boy

             优点:简单直观,使用合理可介绍内存消耗

             缺点:要控制 ziplist 与 hashtable两种编码格式转换,且 hashtable 会消耗更多内存

        总结:对于更新不多的情况下,可以使用序列化,对于value值不大于64字节的可以使用 hash 类型

 

3、数据结构---《列表(List)》

        3.1、用来存储多个有序的字符串,一个列表最多可存 2 的 32 次方减 1 个元素

                 因为有序,可以用过索引下标获取元素或某个范围内元素列表,列表元素可以重复

            3.2、列表命令:

                          添加命令:rpush wangchl c b a  //从右向左插入 cba,返回值3

                                             lrange wangchl 0 -1   //从左到右获取列表所有元素,返回 c b a

                                             lpush key c b a    //从左到右插入cba

                                             linsert wangchl before b tracher  //在b之前插入 teacher,after为之后,使用 lrange wangchl 0 -1 查                                                                                                      看 :c tracher b a

                           查找命令:

                                              lrange key srart end //索引下标特点:从左到右为 0 到N-1

                                              lindex wangchl -1    //返回最右末尾 l,-2 返回 h

                                              llen wangchl    //返回当前列表长度

                                              lpop wangchl   //把最左边的第一个元素删除

                                              rpop wangchl    //把最雨偶变的元素删除

                                            

                                               lrem key count value  //删除指定元素

                                                   如:lpush test b b b b j x z //键test放入 z x j b b b b 

                                                           lrange test 0-1 //查询结果为 z x j b b  b b

                                                           lrem test 4 b    //从最右开始删除 b 的元素,删除 4 个,若lrem test 8 b, 删除8个b, 但只有5                                                                                        个全部删除

                                                            lrange test 0 -1 //删除后的结果为 b j x z

                                                            lrem test 0 b  //检索所有b全部删除 j x z

                                                             lpush user b b b b b j x z //键user从左到右放入 z x j b b b b b

                                                             ltrim user 1 3  //只保留从第2到第4的元素,其它全删

                                                             lrange user 0 -1 //查询结果为 x j b, 其它已全被删掉

                                                             lpush user01 z y x //键user01从左到右放入x y z

                                                             lset user01 2 java // 把第3个元素z替换成java

                                                             lrange user01 0 -1 //查询结果为 x y java

4、数据集合 ----《集合(SET)》

            用户标签,社交,查询有共同兴趣爱好的人,智能推荐

            保存多元素,与列表不一样的是不允许有重复元素,且集合是无序,一个几个最多可存 2 的 32次方减 1 个元素,出了支持增删改查,还支持几个交集、并集、差集;

 

             4.1、集合命令

                          exists user   //检查user 键值是否存在

                          sadd user a b c //向user插入3个元素,返回3

                          sadd user a b  //若再加入相同的元素,则重复无效,返回0

                          smember user  //获取 user 的所以元素,返回结果无序

                          srem user a      //返回1,删除 a 元素

                          scard user  //返回2,计算元素个数

                          sismember user a  //判断元素是否在集合存在,存在返回1,不存在0

                          srandmember user 2 //随机返回 2 个元素,2位元素个数

                          spop user 2     //随机返回2个元素a b ,并将 a b 从集合中删除

                          smember user   //此时已没有a b ,只有c

                       集合的交集:

                           sadd user:1 zhangsan 24 girl

                           sadd user:2 wangchl 24 boy //初始化两个集合

                           sinter user:1 user:2    //求两集合交集,此时返回24

                           sadd user:1 wang 24 girl  //新增第三个元素

                           sinter user:1 user:2 user:3   //求三个集合的交集,此时返回24

                       4.2、使用场景:

                            标签、社交、查询有共同兴趣爱好的人,只能推荐

                             使用方式:

                                        给用户添加标签:

                                                sadd user:1:fav basball fball pq

                                                sadd user:1:fav basball fball

                                                ...........................................

                                          或给标签添加用户

                                                 sadd basball:users user:1 user:3

                                                 sadd fball:users user:1 user:2 user:3

                                                       ........................................................

                                            计算出共同感兴趣的人:

                                                   sinter user:1:fav user:2:fav

                                              规则:sadd(常用于标签)spop/srandember(随机,比如抽奖)

                                                          sadd + sinter(用于社交、查询共同爱好的人,匹配)

5、数据结构----《有序集合》

       常用于排行榜,入视频网站需要对用户上传视频做排行榜或点赞数

             与集合有联系,不能有重复成员

             

              与 List  SET 对比

             5.1命令

                       zadd key score member [score member......]

                       zadd user:zan 200 wangchl//wangchl的点赞数1, 返回操作成功的条数1

                       zadd user:zan 200 wangchl120 mike 100 lee// 返回3

 

                       zadd test:1 nx 100 james   //键test:1必须不存在,主用于添加

                       zadd test:1 xx incr 200 wangchl//键test:1必须存在,主用于修改,此时为300

                       zadd test:1 xx ch incr -299 james //返回操作结果1,300-299=1

  

                       zrange test:1 0 -1 withscores  //查看点赞(分数)与成员名

  

                        zcard test:1     //计算成员个数, 返回1

                      查点赞数

                         zadd test:2 nx 100 james //新增一个集合

                         zscore test:2 james     //查看james的点赞数(分数),返回100

 

                       排名:

                              zadd user:3 200 james 120 mike 100 lee//先插入数据

                              zrange user:3 0 -1 withscores //查看分数与成员

lee

mikejames
100120200

                              zrank user:3 james  //返回名次:第3名返回2,从0开始到2,共3名

                              zrevrank user:3 james //返回0, 反排序,点赞数越高,排名越前

 

                         删除成员:

                              zrem user:3 jame mike //返回成功删除2个成员,还剩lee

                          增加分数:

                              zincrby user:3 10 lee     //成员lee的分数加10

                              zadd user:3 xx incr 10 lee //和上面效果一样

                           返回指定排名范围的分数与成员

                              zadd user:4 200 james 120 mike 100 lee//先插入数据

                              zrange user:4 0 -1 withscores //返回结果如下图

 

                             zrevrange user:4 0 -1 withscores   //倒序,结果如下图

                         返回指定分数范围的成员

                               zrangebyscore user:4 110 300 withscores //返回120 lee ,200 James, 由低到高

                               zrevrangebyscore user:4 300 110 withscores //返回200james 120lee,由高到低

                               zrangebyscore user:4 (110 +inf withscores//110到无限大,120mike 200james

                               

                               zrevrangebyscore user:4 (110 -inf withscores//无限小到110,返回100 lee

                        返回指定分数范围的成员个数:

                               zcount user:4 110 300  //返回2,由mike120和james200两条数据

 

                        删除指定排名内的升序元素:

                               zremrangebyrank user:4 0 1 //分数升序排列,删除第0个与第1个,只剩james

 

                         删除指定分数范围的成员

                                zadd user:5 200 james 120 mike 100 lee//先插入测试数据

                                zremrangebyscore user:5 100 300     //删除分数在100与300范围的成员

                                zremrangebyscore user:5 (100 +inf    //删除分数大于100(不包括100),还剩lee

                         有序集合交集:

                                格式:zinterstore destination numkeys key ... [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

                                destination:交集产生新的元素存储键名称

                                numkeys:  要做交集计算的键个数

                                key :元素键值

                                weights:每个被选中的键对应值乘weight, 默认为1

                           初始化数据:

                                zadd user:7 1 james 2 mike 4 jack 5 kate      //初始化user:7数据

                                zadd user:8 3 james 4 mike 4 lucy 2 lee  6 jim  //初始化user:8数据

                          交集例子:

                                 zinterstore user_jj 2 user:7 user:8 aggregate sum //2代表键合并个数,

                                //aggregate sum可加也不可加上,因为默认是sum

                                 //结果user_jj:4james(1+3), 6mike(2+4)

 

                                  zinterstore user_jjmax 2 user:7 user:8 aggregate max min

                                //取交集最大的分数,返回结果 3james  4mike, min取最小

                       5.2使用场景:

                                   排行榜系统,如视频网站需要对用户上传的视频做排行榜

                                   点赞数:zadd user:1:20180106 3 mike  //mike获得3个赞

                                   再获一赞:zincrby user:1:20180106 1 mike  //在3的基础上加1

                                   用户作弊,将用户从排行榜删掉:zrem user:1:20180106 mike

                                   展示赞数最多的5个用户:

                                   zadd user:4:20160101 9 jack 10 jj 11 dd 3 james 4 lee 6 mark 7 kate

                                   zrevrangebylex user:4:20160101 + - limit 0 5

                              查看用户赞数与排名:

                                    zscore user:1:20180106 mike   zrank user:1:20180106 mike

6 、全局命令

                     1,查看所有键:keys *   set school enjoy   set hello world

                     2,键总数 dbsize  //2个键,如果存在大量键,线上禁止使用此指令

                     3,检查键是否存在:exists key  //存在返回1,不存在返回0

                     4,删除键:del key  //del hello school, 返回删除键个数,删除不存在键返回0

                     5,键过期:expire key seconds  //set name test  expire name 10 //10秒过期

                                ttl 查看剩余的过期时间

                     6,键的数据结构类型:type key //type hello  //返回string,键不存在返回none

 

         6.1键的遍历

                   redis提供了两个命令来遍历所有的键

                   1,键全量遍历:

                        mset country china city bj name james  //设置3个字符串键值对

                         keys  * //返回所有的键, *匹配任意字符多个字符

                         keys *y //以结尾的键,

                         keys n*e //以n开头以e结尾,返回name

 

                         keys n?me  //  ?问号代表只匹配一个字符  返回name,全局匹配

                         keys n?m*   //返回name

 

                         keys [j,l]*  //返回以j l开头的所有键  keys [j]ames 全量匹配james

                         考虑到是单线程, 在生产环境不建议使用,如果键多可能会阻塞

                         如果键少,可以

             6.2、渐进式遍历

mset  a a b b c c d d e e f f g g h h i i j j k k l l m m n n o o p p q q r r s s t t u u v v w w x x y y z z    //初始化26个字母键值对

                    字符串类型:

                               SCAN命令用于迭代当前数据库中的数据库键。  

                                返回结果为:用于下一次迭代的新游标4096;所有被迭代的元素

                                如果数据集合不是以哈希表作为底层实现的话,则scan类命令无视count选项,直接返回数据集合中的所                                     有元素

                                  mset n1 1 n2 2 n3 3 n4 4 n5 5 n6 6 n7 7 n8 8 n9 9 n10 10 n11 11 n12 12 n13 13

                                 scan 0 match n*  //匹配以n开头的键,最大是取10条,第一次scan 0开始

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis API文档。Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。redis的官网地址,非常好记,是redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地)目前,Vmware在资助着redis项目的开发和维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值