zoukankan      html  css  js  c++  java
  • Redis-常用操作详解

    Redis连接

    Redis安装配置,参考上一篇博文

    redis数据是以key-value方式存储,key永远都是string类型,value可以是String、List、Set、Sorted-Sets、Hash,连接redis服务器,默认是第一个数据库

    进入目录cd /usr/local/redis/bin/

    连接redis./redis-cli,出现127.0.0.1:6379>则连接成功

    默认有16个数据库,db0~15

    切换数据库select index select 1 索引从0开始

    显示所有的key键keys *,可以用tab键补全命令,补全命令为大写

    Redis基本命令 String

    • set,设置键 set name test1

    • get,获取键值get name

    • exist,判断键是否存在,返回1存在和0不存在exist name

    • append,如果键不存在则创建该键,返回键的值长度;如果键存在则追加,返回追加后值长度append name test1

      • 如果值有空格,则需要加引号append name "zhang san"

    • strlen,获取key的长度strlen name

    • EX、PX表示失效时间,单位为秒和毫秒,不能同时使用,NX表示数据库中不存在时才能设置,XX表示存在时才能设置set key value [expiration EX seconds|PX milliseconds] [NX|XX]

    • ttl查看过期剩余时间,-2表示过期

      127.0.0.1:6379> set job tester1 EX 10 NX
      OK
      127.0.0.1:6379> ttl job
      (integer) 6
      127.0.0.1:6379> ttl job
      (integer) 5
      127.0.0.1:6379> ttl job
      (integer) 4
      127.0.0.1:6379> ttl job
      (integer) 3
      127.0.0.1:6379> ttl job
      (integer) 2
      127.0.0.1:6379> ttl job
      (integer) 2
      127.0.0.1:6379> ttl job
      (integer) 1
      127.0.0.1:6379> ttl job
      (integer) -2
      127.0.0.1:6379> ttl job

      进行第二次set设置,ttl值会显示-1

      127.0.0.1:6379> set job tester1
      OK
      127.0.0.1:6379> set job tester1 EX 10 NX
      (nil)
      127.0.0.1:6379> ttl job
      (integer) -1
    • flushdb,清空数据库flushdb 查看所有key键则会显示(empty list or set)

    • incr,递增1

      127.0.0.1:6379> set age 22
      OK
      127.0.0.1:6379> incr age
      (integer) 23
      127.0.0.1:6379> get age
      "23"
    • decr,递减1

      127.0.0.1:6379> get age
      "23"
      127.0.0.1:6379> decr age
      (integer) 22
      127.0.0.1:6379> get age
      "22"
    • del,删除键,删除后还可以用incr递增、decr递减进行操作,但是基于默认值0

      127.0.0.1:6379> del age
      (integer) 1
      127.0.0.1:6379> get age
      (nil)
      127.0.0.1:6379> incr age
      (integer) 1
      127.0.0.1:6379> get age
      "1"
      127.0.0.1:6379> decr age
      (integer) 0
      127.0.0.1:6379> get age
      "0"

      下面字符串能转换为整型

      127.0.0.1:6379> set age "22"
      OK
      127.0.0.1:6379> get age
      "22"
      127.0.0.1:6379> incr age
      (integer) 23
      127.0.0.1:6379> get age
      "23"

      下面字符串不能转换为整型

      127.0.0.1:6379> set age "hello"
      OK
      127.0.0.1:6379> incr age
      (error) ERR value is not an integer or out of range
    • incrby,递增,可以设置步长

      127.0.0.1:6379> set age 20
      OK
      127.0.0.1:6379> incrby age 5
      (integer) 25
      127.0.0.1:6379> get age
      "25"

      不加步长会报错

      127.0.0.1:6379> incrby age
      (error) ERR wrong number of arguments for 'incrby' command
    • decrby,递减,可以设置步长

    • getset,获取值并设置新的值

      127.0.0.1:6379> get age
      "25"
      127.0.0.1:6379>
      127.0.0.1:6379> getset age 30
      "25"
      127.0.0.1:6379> get age
      "30"
    • setex,设置过期时间

      setex key seconds value,等同于set key value ex seconds

    • setnx,当key不存在时,才能设置,等同于set key value nx,key存在则不能设置

    • setrange,设置指定索引位置的字符,索引0开始

      从索引为6的位置开始替换 setrange key offset value

      127.0.0.1:6379> set age "hello world"
      OK
      127.0.0.1:6379> get age
      "hello world"
      127.0.0.1:6379> setrange age 6 job
      (integer) 11
      127.0.0.1:6379> get age
      "hello jobld"

      超过的长度使用0代替

      127.0.0.1:6379> setrange age 20 job
      (integer) 23
      127.0.0.1:6379> get age
      "hello jobldx00x00x00x00x00x00x00x00x00job"
    • getrange,获取指定索引位置的字符,索引0开始getrange key start end

      获取闭合区间里的值,[1,3]

      127.0.0.1:6379> set age "hello world"
      OK
      127.0.0.1:6379> getrange age 1 3
      "ell"
    • mset,批量设置keymset key value [key value ...]

    • mget,批量获取keymget key [key ...]

      127.0.0.1:6379> mset job1 1 job2 2 job3 3
      OK
      127.0.0.1:6379> mget job1 job2 job3
      1) "1"
      2) "2"
      3) "3"
    • msetnx,批量设置key,如果key都不存在则成功返回1,若有一个存在则失败返回0

      msetnx j 1 k 2 l 3 [key

    Redis基本命令 List

    • lpush,创建键及其关联的List,然后将参数values从左到右排序

    • lrange获取从位置0到位置2的元素,0 -1获取全部元素,-3 -2获取倒数第3个到第2个元素,0 0获取第一个元素

      127.0.0.1:6379> lpush age 1 2 3 4
      (integer) 4
      127.0.0.1:6379> lrange age 0 2
      1) "4"
      2) "3"
      3) "2"
      127.0.0.1:6379> lrange age 0 -1
      1) "4"
      2) "3"
      3) "2"
      4) "1"
      127.0.0.1:6379> lrange age -3 -2
      1) "3"
      2) "2"
      127.0.0.1:6379> lrange age 0 0
      1) "4"
    • type,查看数据类型type age

    • lpushx,键存在时才能插入,不存在返回0

      127.0.0.1:6379> lpushx age123 1 2
      (integer) 0
      127.0.0.1:6379> lpushx age 1 2
      (integer) 6
      127.0.0.1:6379> lrange age 0 -1
      1) "2"
      2) "1"
      3) "4"
      4) "3"
      5) "2"
      6) "1"
    • lpop,却出链表头部的元素,相当于删除

      127.0.0.1:6379> lrange age 0 -1
      1) "1"
      2) "4"
      3) "3"
      4) "2"
      5) "1"
      127.0.0.1:6379> lpop age
      "1"
      127.0.0.1:6379> lrange age 0 -1
      1) "4"
      2) "3"
      3) "2"
      4) "1"
    • llen,返回列表长度

      127.0.0.1:6379> lrange age 0 -1
      1) "4"
      2) "3"
      3) "2"
      4) "1"
      127.0.0.1:6379> llen age
      (integer) 4
    • lrem,删除几个值等于x的元素,并返回个数

      127.0.0.1:6379> flushdb
      OK
      127.0.0.1:6379> lpush age 1 1 2 3 3 4 5
      (integer) 7
      127.0.0.1:6379> lrem age 2 1
      (integer) 2
      127.0.0.1:6379> lrange age 0 -1
      1) "5"
      2) "4"
      3) "3"
      4) "3"
      5) "2"
    • lindex,获取索引对应的值

      127.0.0.1:6379> lrange age 0 -1
      1) "5"
      2) "4"
      3) "3"
      4) "3"
      5) "2"
      127.0.0.1:6379> lindex age 1
      "4"
      127.0.0.1:6379> lindex age 0
      "5"

      索引值超过链表中元素数量,则返回nil

    • lset,修改索引对应的元素值

      127.0.0.1:6379> lrange age 0 -1
      1) "5"
      2) "4"
      3) "3"
      4) "3"
      5) "2"
      127.0.0.1:6379> lset age 0 a
      OK
      127.0.0.1:6379> lrange age 0 -1
      1) "a"
      2) "4"
      3) "3"
      4) "3"
      5) "2"

      设置的索引值超过链表中的元素数量,则返回error

    • ltrim,仅保留索引之间的元素,索引值俩边也被保留

      127.0.0.1:6379> lrange age 0 -1
      1) "a"
      2) "4"
      3) "3"
      4) "3"
      5) "2"
      127.0.0.1:6379> ltrim age 0 2
      OK
      127.0.0.1:6379> lrange age 0 -1
      1) "a"
      2) "4"
      3) "3"
    • linset,在具体值前面插入新元素或者后面插入新元素linsert key BEFORE|AFTER pivot value

      127.0.0.1:6379> lrange age 0 -1
      1) "c"
      2) "b"
      3) "a"
      4) "a"
      5) "4"
      6) "3"
      127.0.0.1:6379> linsert age before c d
      (integer) 7
      127.0.0.1:6379> lrange age 0 -1
      1) "d"
      2) "c"
      3) "b"
      4) "a"
      5) "a"
      6) "4"
      7) "3"
      127.0.0.1:6379> linsert age after c ff
      (integer) 8
      127.0.0.1:6379> lrange age 0 -1
      1) "d"
      2) "c"
      3) "ff"
      4) "b"
      5) "a"
      6) "a"
      7) "4"
      8) "3"
    • rpush,从链表尾部插入参数,顺序是从右到左依次插入

      127.0.0.1:6379> rpush age a b c d e
      (integer) 5
      127.0.0.1:6379> lrange age 0 -1
      1) "a"
      2) "b"
      3) "c"
      4) "d"
      5) "e"
    • rpushx,将元素插入链表尾部

      127.0.0.1:6379> rpushx age f
      (integer) 6
      127.0.0.1:6379> lrange age 0 -1
      1) "a"
      2) "b"
      3) "c"
      4) "d"
      5) "e"
      6) "f"
    • rpop,从链表尾部取出元素,相当于删除

      127.0.0.1:6379> lrange age 0 -1
      1) "a"
      2) "b"
      3) "c"
      4) "d"
      5) "e"
      6) "f"
      127.0.0.1:6379> rpop age
      "f"
      127.0.0.1:6379> lrange age 0 -1
      1) "a"
      2) "b"
      3) "c"
      4) "d"
      5) "e"
    • rpoplpush,将一个链表的元素最后一位取出,添加到另外一个链表的头部

      127.0.0.1:6379> lrange age 0 -1
      1) "a"
      2) "b"
      3) "c"
      4) "d"
      5) "e"
      127.0.0.1:6379> lrange age1 0 -1
      1) "3"
      2) "2"
      3) "1"
      127.0.0.1:6379> rpoplpush age age1
      "e"
      127.0.0.1:6379> lrange age1 0 -1
      1) "e"
      2) "3"
      3) "2"
      4) "1"

      将source和destination设为同一键,将链表中的尾部元素移到其头部

      127.0.0.1:6379> lrange age 0 -1
      1) "d"
      2) "a"
      3) "b"
      4) "c"
      127.0.0.1:6379> rpoplpush age age
      "c"
      127.0.0.1:6379> lrange age 0 -1
      1) "c"
      2) "d"
      3) "a"
      4) "b"

    Redis基本命令 Set

    • sadd,当键不存在,才能成功插入多个元素sadd age 1 2 3

      不能插入重复数据

      127.0.0.1:6379> smembers age
      1) "1"
      2) "2"
      3) "3"
      4) "123"
      127.0.0.1:6379> sadd age 1 4 5
      (integer) 2
      127.0.0.1:6379> smembers age
      1) "1"
      2) "2"
      3) "3"
      4) "4"
      5) "5"
      6) "123"
    • smembers,查看集合中的元素smembers age

    • sismember,判断元素是否存在,存在返回1,不存在返回0

      127.0.0.1:6379> sismember age 9
      (integer) 0
      127.0.0.1:6379> sismember age 1
      (integer) 1
    • scard,获取集合元素数量scard age

    • srandmember,随机返回一个成员,但还是存在集合中srandmember age

    • spop,随机取出一个成员,集合中就被删除了spop age

    • srem,从集合中取出元素,只会提取存在的元素

      127.0.0.1:6379> sadd age 1 2 3 4 5
      (integer) 5
      127.0.0.1:6379> srem age 1 2 a
      (integer) 2
      127.0.0.1:6379> smembers age
      1) "3"
      2) "4"
      3) "5"
    • smove,将一个集合元素移动到另外一个集合中

      127.0.0.1:6379> smembers age
      1) "3"
      2) "4"
      3) "5"
      127.0.0.1:6379> sadd age1 a b c
      (integer) 3
      127.0.0.1:6379> smembers age1
      1) "c"
      2) "a"
      3) "b"
      127.0.0.1:6379> smove age age1 3
      (integer) 1
      127.0.0.1:6379> smembers age1
      1) "3"
      2) "c"
      3) "a"
      4) "b"
    • sdiff,比较几个集合中存在差异的元素

      其中4、5是age3中没有的元素

      127.0.0.1:6379> smembers age
      1) "4"
      2) "5"
      127.0.0.1:6379> smembers age1
      1) "3"
      2) "c"
      3) "a"
      4) "b"
      127.0.0.1:6379> smembers age3
      1) "u"
      2) "i"
      127.0.0.1:6379> sdiff age age1
      1) "4"
      2) "5"
      127.0.0.1:6379> sdiff age age1 age3
      1) "4"
      2) "5"
    • sdiffstore,将三个集合的差异元素存储在destination关联的Set中,并返回插入的元素数量

      127.0.0.1:6379> sdiffstore destination age age1 age3
      (integer) 2
      127.0.0.1:6379> smembers destination
      1) "4"
      2) "5"
    • sinter,获取多个集合直接的交集sinter age age1 age3

    • sinterstore,将三个集合的交集元素存储在destination关联的Set中,并返回交集的数量sinterstore age age1 age3

    • sunion,获取多个集合之间的并集sunion age age1 age3

    • sunionstore,将三个集合的并集元素存储在destination关联的Set中,并返回并集的数量sunionstore age age1 age3

    Redis基本命令 Sorted Set

    也称为Zset,Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员,但分数(score)却可以重复,redis正是通过分数来为集合中的成员进行从小到大的排序。

    • zadd

    • 添加1个分数为10的成员zadd age 10 a

    • 添加2个分数为20,30的成员zadd age 20 b 30 c

    • zrange

    • 通过索引获取元素,0 -1表示全部元素zrange age 0 -1

    • 加WITHSCORES表示返回结果带分数zrange age 0 -1 WITHSCORES

    • zcard,获取test键中成员数量zcard age

    • zrank,获取成员在集合中的索引,从0开始zrank age a

    • zcount,获取符合条件的成员数量,分数满足10-20的成员数量zcount age 10 20

    • zrem,删除成员并返回删除的数量zrem age a b

    • zscore,获取成员的分数,返回的是字符串形式zscore age c

    • zincrby,增加或减少(-)成员的分数,返回增加后的分数zincrby age 10 c

    • zrangebyscore,通过分数获取满足条件的成员zrangebyscore age 10 20

    • ­inf表示第一个成员,+inf表示最后一个成员,limit后面的参数用于限制返回成员的数量, limit 2 2,2表示从位置索引(0­-based)等于2的成员开始,取后面2个成员,成员不足就有多少显示多少,类似于MySQL中的limit

    • zrangebyscore age -inf +inf

    • zrangebyscore age -inf +inf withscores

    • zrangebyscore age -inf +inf limit 2 2

    • zrangebyscore age -inf +inf withscores limit 2 2

    • zrangebyscore age 10 20 withscores limit 2 2

    • zremrangebyscore,根据分数条件删除成员并返回删除数量zremrangebyscore age 10 20

    • zremrangebyrank,根据索引条件删除成员zremrangebyrank age 0 1

    • zrevrange,按索引高到低获取成员

    • zrevrange age

    • 获取前10,zrevange age 0 9

    • zrevrangebyscore,根据索引从高到低根据分数获取成员

    • zrevrangebyscore age 30 10

    • zrevrank,索引由高到低的排序,获取成员在集合中的索引

    • zrevrank age a

    Redis基本命令 Hash

    • hset,给键设置字段hset me name zhangsan

    • hget,获取字段hget me name

    • hlen,获取字段数量hlen me

    • hexists,判断字段是否存在,存在返回1hexists me height

    • hdel,删除字段,成功返回1,重复删除返回0hdel me name

    • hsetnx,添加新字段,并设置值hsetnx me age 22

    • hincrby,给字段的值加1、或者减-1hincrby me age 1

    • hmset,设置多个字段hmset me height 177 weight 140

    • hmget,获取多个字段hmget me height age

    • hgetall,返回所有字段及值hgetall me

    • hkeys,获取所有字段的名字hkeys me

    • hvals,获取所有字段的值hvals me

    Redis基本命令 Key

    • keys * ,显示所有的键

    • del ,删除一个或多个键

      批量删除

    • exists,判断key是否存在,不存在返回0

    • move,将当前数据库的键移动到其它db1数据库

      127.0.0.1:6379> exists age
      (integer) 1
      127.0.0.1:6379> move age 1
      (integer) 1
      127.0.0.1:6379> EXISTS age
      (integer) 0
      127.0.0.1:6379> select 1
      OK
      127.0.0.1:6379[1]> EXISTS age
      (integer) 1
    • rename,修改键的名称rename age newage

    • renamenx,当新名称不存在时才执行

      127.0.0.1:6379[1]> set city shanghai
      OK
      127.0.0.1:6379[1]> set newcity hangzhou
      OK
      127.0.0.1:6379[1]> renamenx city newcity
      (integer) 0
      127.0.0.1:6379[1]> get city
      "shanghai"
      127.0.0.1:6379[1]> get newcity
      "hangzhou"
    • ttl,给键设置超时时间,单位秒

      set age ex 100

      ttl age查看剩余多久

    • persist,将设置超时的键改为永久键

      persist age 100

      ttl age查看剩余时间,返回-1代表该键已经变为永久

    • expire,更新键超时时间

      expire age 200

    • expireat,unix时间戳格式设置键超时时间

      expireat age 1588918492

    • 不同类型的测试数据,用type来查看数据类型

      127.0.0.1:6379[1]> set name katy
      OK
      127.0.0.1:6379[1]> lpush testlist a b c
      (integer) 3
      127.0.0.1:6379[1]> sadd testset 1 2 3
      (integer) 3
      127.0.0.1:6379[1]> zadd testzset 10 a 20 b
      (integer) 2
      127.0.0.1:6379[1]> hset testhash name zhangsan age 20
      (integer) 2
      127.0.0.1:6379[1]> type name
      string
      127.0.0.1:6379[1]> type testlist
      list
    • randomkey,返回任意键

    • flushdb,清空当前数据库

    • dbsize,返回当前数据库key的数量

    Redis基本命令 事务

    事务中如果有一条命令执行失败,其后命令仍然会被执行

    • multi,添加新事务,标记事务的开始

    • exec,执行一个事务命令队列内的所有命令

    • discard,回滚事务队命令列内的所有命令。discard只能在exec前执行

    • 执行第一条命令,但命令是存在事务命令队列的,没有立即执行

      127.0.0.1:6379[1]> incr age
      QUEUED
    • 执行第二条命令,命令也被存在事务命令队列的,没有立即执行

      127.0.0.1:6379[1]> incr age2
      QUEUED
    • 执行所有事务命令队列中所有命令

      127.0.0.1:6379[1]> exec
      1) (integer) 1
      2) (integer) 1
      127.0.0.1:6379[1]> get age
      "1"
      127.0.0.1:6379[1]> get age2
      "1"
    • 开启新事务,设置键及string类型的值

      set name zhangsan

      从键name所关联的值的头部弹出元素,由于该值是字符串类型,而lpop命令仅能用于List类型,因此在执行exec命令时,该命令将会失败

      127.0.0.1:6379[1]> lpop name
      (error) WRONGTYPE Operation against a key holding the wrong kind of value

      再次设置键name的值为字符串,获取键name的值,以便确认该值是否被事务中的第二个set命令设置成功

      127.0.0.1:6379[1]> set name lisi
      OK
      127.0.0.1:6379[1]> get name
      "lisi"

      从结果中可以看出,事务中的第二条命令lpop执行失败,而其后的set和get命令均执行成功,这一点是Redis的事务与关系型数据库中的事务之间最为重要的差别

      为键city设置一个事务执行前的值;开启一个事务;在事务内为该键设置一个新值;放弃事务;查看键city的值,从结果中可以看出该键的值仍为事务开始之前的值

      127.0.0.1:6379[1]> set name lisi
      OK
      127.0.0.1:6379[1]> get name
      "lisi"
      127.0.0.1:6379[1]> set city shanghai
      OK
      127.0.0.1:6379[1]> multi
      OK
      127.0.0.1:6379[1]> set city hangzhou
      QUEUED
      127.0.0.1:6379[1]> discard
      OK
      127.0.0.1:6379[1]> get city
      "shanghai"

      discard只能在exec前执行

      127.0.0.1:6379[1]> discard
      (error) ERR DISCARD without MULI
  • 相关阅读:
    Java中常见的几种加密算法
    关于redis中过期的key的处理
    Redis 的内存淘汰策略
    AES加密算法原理(加密过程)
    springboot中从配置文件中读取相关参数值
    springboot中切换配置(多个配置文件--生产、开发、测试)
    mysql跨库查询数据
    SpringBoot2.0 的默认连接池----Hikari
    Druid连接池中的缓存机制
    Opus编解码练习
  • 原文地址:https://www.cnblogs.com/katyhudson/p/13413118.html
Copyright © 2011-2022 走看看