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 jobld\x00\x00\x00\x00\x00\x00\x00\x00\x00job"
  • 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
posted @ 2020-08-01 02:35  tester01home  阅读(273)  评论(0编辑  收藏  举报