Redis的指令组(一)

Redis的指令组(一)

  • 写在前面
    • 简介
    • 与Memcached的对比
  • redis的命令组
    • 命令组介绍
    • strings命令组
      • 对字符串的操作指令
      • 对数值类型操作指令

写在前面

简介

上篇文章介绍了Redis的安装,官网上是这样介绍的,Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)
这段话高度概括了Redis的功能,它支持多种数据结构,提供多种可持久化方案,并且提供分布式和集群的部署方案,保证高可用性。
单看上面的介绍,咱们可能还感觉不到redis的强大之处。下面将同是作为内存存储的开源的memcache与Redis做一个对比。

与Memcached的对比

数据来源于 https://db-engines.com/。
下列图中第二列为Memcached第三列为Redis。
排名情况

  • 在缓存数据库排名中Redis排名第一,Memcached排名第四
    在这里插入图片描述
  • 上图中Typing类型对比,Memcached那一栏为no(其实是只支持string类型),而Redis支持多种类型。
    Redis的指令组(一)_第1张图片
  • Redis支持二级索引,Memcached不支持。他们同为NoSql。Redis比Memcached支持的语言多得多,当面临多语言开发团队的时候Redis会有更好的支持性。
    Redis的指令组(一)_第2张图片
  • Redis 服务器支持Lua脚本执行。Redis 使用单个 Lua 解释器去运行所有脚本,并且, Redis 也保证脚本会以原子性(atomic)的方式执行:当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行。这和使用 MULTI / EXEC 包围的事务很类似。在其他别的客户端看来,脚本的效果(effect)要么是不可见的(not visible),要么就是已完成的(already completed)。而Memcached不支持任何语言脚本。
  • Redis提供分布式和高可用的集群部署方案,而Memcached不支持。
  • Redis提供一些原子性操作,而Memcached不支持。
  • Redis支持持久化,而Memcached不支持。

redis的命令组

命令组介绍

redis的命令十分丰富,其分为14个命令组,如下:

  • cluster :跟集群操作有关的命令组,比如:cluster info等
  • connection:跟链接有关的命令组,比如:auth,quit,select 等
  • geo:跟地理位置有关的命令组,比如:geoadd,geohash等
  • hashes:操作数据类型为map的命令组,比如:hset,hmset,hget等
  • HyperLogLog:获取基数的命令组(一般用于大数据统计等),比如:pfadd等
  • keys:操作key的命令组,比如:del,object,expire等
  • lists:操作数据类型为列表的命令组,比如lset,lget,lpush,lpop等
  • pub/sub:发布订阅操作指令组,比如pubsub,publish等
  • scripting:执行lua脚本的操作指令组,比如eval,evalsha等
  • server:操作服务端数据的指令组,比如:bgrewriteaof,bgsave等
  • sets:操作数据类型为集合的指令组,比如 sadd,scard,sdiff等
  • sorted sets:操作数为有序集合的指令组,比如zadd,zcard等
  • streams:流操作指令组,比如:xack,xadd等
  • strings:操作数据类型为字符的指令组,比如:set,get,mset,setnx等
  • transcations:事务的指令组,比如:exec,watch等

strings命令组

对字符串的操作指令

在客户端通过 help @string 可以查看所有string的操作指令

在这里插入图片描述
set指令可以给一个key设置一个值,后面可以跟 [ex seconds(有效期单位为秒) | px milliseconds(有效期单位为毫秒)] | [nx(没有key是设置成功) | xx(有key是设置成功)]
下面是在客户端的运行事例即结果。
Redis的指令组(一)_第3张图片
set key value nx , set key value ex seconds, set key value px millisenconds value的设置方式也可以通过 setnx key valuesetex key seconds value, psetex key milliseconds value实现。
setnx指令保证只能有一个线程可以将key设置成功,所以该指令经常用于分布式锁,为了避免死锁,可以设置超时时间。

不过没有setxx
Redis的指令组(一)_第4张图片
对于过期的key,Redis并不会马上主动清除key,其实Redis的清楚策略有三种:

  • 被动删除:当客户端操作一个过期的key时,才会主动删除key,比如:get,set,del, incr等
  • 主动删除:服务端会定期检查整理自身的资源,这个过程中会删除一批过期的key
  • 超过maxmemory时,会主动删除过期的key

setrange 指令可以根据给定的下标替换key的值。如果key为空并且不是从第0个位置开始替换的则用0补充。
Redis的指令组(一)_第5张图片

get指令可以获取通过set指令设置的key的值。
getset指令除了设置key的值还返回老的值。
getrange指令可以截取指定位置的字符串。redis中除了正向索引(1,2,3…) 还有反向索引(…-3,-2,-1),两者可以结合使用。
在这里插入图片描述
Redis的指令组(一)_第6张图片
Redis的指令组(一)_第7张图片
append指令可以在给定个key后面追加内容
在这里插入图片描述
Redis的指令组(一)_第8张图片
除了设置单个key的,redis还支持设置多个值的指令。
mget指令可以一次获取多个key的值
mset指令可以一次设置多个key的值
Redis的指令组(一)_第9张图片
在这里插入图片描述
msetnx指令可以一次性设置多个值,仅在设置的key都不存在时成功。如果有多余一个key存在时那么所有的key都设置不成功。
在这里插入图片描述
Redis的指令组(一)_第10张图片
strlen 指令返回指定key的字节个数
Redis的指令组(一)_第11张图片
通过上面的运行结果,对于k1的长度是10没有问题,但是k2返回的长度是6 。因为我的客户端是UTF8编码方式,UTF8会将一个汉字用三个字节表示,这里两个汉字所以返回的长度是6 。说明strlen获取的长度是字节的个数。通过get指令获取的k2的值返回的是字节编码。
Redis是一个二进制安全的存储系统,即客户端以什么样的编码格式发给服务端,服务端会不做任何处理的存入系统,当获取时会原封不动的返回给客户端。所以对于同一个key存储获取获取的多个客户端需要保持编码一直,否则可能会出现解码后乱码的情况。
比如对于汉字“中国”UTF8编码的客户端与GBK编码的客户端有不同的编码,所以服务端存储的也会不一样,通过strlen获取的长度也不一样前者长度为 6 后者长度 为 4.下面看一下运行结果:

客户端为UTF8编码的运行结果:
Redis的指令组(一)_第12张图片
客户端为GBK编码的运行结果:
Redis的指令组(一)_第13张图片
通过redis-cli --raw链接服务端,get指令会按客户端的编码进行格式化:
Redis的指令组(一)_第14张图片
可以发现k2的值是乱码,因为设置k2的客户端的编码为UTF8,而get k2的客户端的编码为GBK。
这就是Redis的二进制安全。

对数值类型操作指令

你可能感兴趣的:(redis,java,redis)