字符串
字符串是所有编程语言中最常见的和最常用的数据类型,而且也是redis最基本的数据类型之一,而且redis中所有的key的类型都是字符串。常用于保存 Session 信息场景,此数据类型比较常用
命令 | 含义 | 复杂度 |
set key value | 设置key-value | o(1) |
get key | 获取key-value | o(1) |
del key | 删除key-value | o(1) |
setnx setxx | 根据key是否存在设置key-value | o(1) |
Incr decr | 计数 | o(1) |
mget mset | 批量操作key-value | o(n) |
添加key
set指令可以创建一个key并赋值,使用格式
SET key value [EX seconds] [PX milliseconds] [NX|XX] 时间复杂度: O(1) 将字符串值 value 关联到 key 。 如果 key 已经持有其他值, SET 就覆写旧值, 无视类型。 当 SET 命令对一个带有生存时间(TTL)的键进行设置之后, 该键原有的 TTL 将被清除。 从 Redis 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改: EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等 同于执行 SETEX key seconds value 。 PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX milliseconds 的效果等同于执行 PSETEX key milliseconds value 。 NX : 只在键不存在时, 才对键进行设置操作。 执行 SET key value NX 的效果等同于执行 SETNX key value 。 XX : 只在键已经存在时, 才对键进行设置操作。
不论key是否存在,都设置 127.0.0.1:6379> set hexingchen huiji OK 127.0.0.1:6379> get hexingchen "huiji" 127.0.0.1:6379> TYPE key1 判断类型 none 127.0.0.1:6379> set ZX zx 大小写敏感 OK 127.0.0.1:6379> get ZX "zx" 127.0.0.1:6379> get zx (nil) 127.0.0.1:6379> set zx xz ex 3 设置自动过期时间3s OK 127.0.0.1:6379> get zx "xz"
key值不存在才设置,相当于add 127.0.0.1:6379> get hexingchen "huiji" 127.0.0.1:6379> setnx hexingchen hao (integer) 0 127.0.0.1:6379> get hexingchen "huiji" 127.0.0.1:6379> setnx zzz zzz (integer) 1 127.0.0.1:6379> set zzz
key存在,才设置,相当于update 127.0.0.1:6379> get zzz "zzz" 127.0.0.1:6379> set zzz xxz xx OK 127.0.0.1:6379> get zzz "xxz" 127.0.0.1:6379> get age (nil) 127.0.0.1:6379> set age 20 xx (nil) 127.0.0.1:6379> get age (nil)
获取key
127.0.0.1:6379> get zzz "xxz"
删除key
127.0.0.1:6379> DEL hexingchen 删除一个key (integer) 1 127.0.0.1:6379> DEL ZX zzz 删除多个key (integer) 2
批量设置多个key
127.0.0.1:6379> mset zx xz xc cx OK
批量获取多个key
127.0.0.1:6379> mget zx xc 1) "xz" 2) "cx" 127.0.0.1:6379> KEYS * 1) "key-6" 2) "key-9" 3) "key-4" 4) "key-7" 5) "xc" 6) "key-5" 7) "key-2" 8) "key-10" 9) "eixtexit" 10) "zx" 11) "key-3" 12) "key-1" 13) "key-8" 127.0.0.1:6379> KEYS k* 1) "key-6" 2) "key-9" 3) "key-4" 4) "key-7" 5) "key-5" 6) "key-2" 7) "key-10" 8) "key-3" 9) "key-1" 10) "key-8"
追加数据
127.0.0.1:6379> append zx lova (integer) 6 127.0.0.1:6379> get zx "xzlova"
设置新值并返回旧值
127.0.0.1:6379> get zx "xzlova" 127.0.0.1:6379> getset zx as "xzlova" 127.0.0.1:6379> get zx "as"
返回字符串key对应的字节数
127.0.0.1:6379> get zx "as" 127.0.0.1:6379> strlen zx (integer) 2 127.0.0.1:6379> append zx llllll (integer) 8 127.0.0.1:6379> get zx "asllllll" 127.0.0.1:6379> strlen zx (integer) 8 127.0.0.1:6379> set as 五聊 OK 127.0.0.1:6379> get as "\xe4\xba\x94\xe8\x81\x8a" 127.0.0.1:6379> strlen as (integer) 6 127.0.0.1:6379>
判断key是否存在
127.0.0.1:6379> exists as (integer) 1 127.0.0.1:6379> exists as zx 返回值为2,表示存在2个key,0表示不存在 (integer) 2 127.0.0.1:6379> set name hxc ex 10 OK 127.0.0.1:6379> exists name (integer) 0 127.0.0.1:6379> set name hxc ex 10 OK 127.0.0.1:6379> exists name 过几秒再看 (integer) 1 127.0.0.1:6379> exists name (integer) 0
查看key的过期时间
ttl key #查看key的剩余生存时间,如果key过期后,会自动删除
-1 #返回值表示永不过期,默认创建的key是永不过期,重新对key赋值,也会从有剩余生命周期变成永不过期
-2 #返回值表示没有此key
num #key的剩余有效期
127.0.0.1:6379> ttl zx (integer) -1 127.0.0.1:6379> set as as ex 20 OK 127.0.0.1:6379> ttl as (integer) 16 127.0.0.1:6379> ttl as (integer) 14 127.0.0.1:6379> ttl as (integer) 9 127.0.0.1:6379> ttl as (integer) 3 127.0.0.1:6379> ttl as (integer) -2
重新设置key的过期时间
127.0.0.1:6379> expire zx 1000 (integer) 1 127.0.0.1:6379> ttl zx (integer) 992
取消key的过期时间
127.0.0.1:6379> ttl zx (integer) 871 127.0.0.1:6379> persist zx (integer) 1 127.0.0.1:6379> ttl zx (integer) -1
数据递增
利用INCR命令簇(INCR, DECR, INCRBY,DECRBY)来把字符串当作原子计数器使用。
127.0.0.1:6379> set num 10 OK 127.0.0.1:6379> incr num (integer) 11 127.0.0.1:6379> get num "11"
数据递减
127.0.0.1:6379> get num "11" 127.0.0.1:6379> decr num (integer) 10 127.0.0.1:6379> get num "10"
数值增加
将key对应的数字加decrement(可以是负数)。如果key不存在,操作之前,key就会被置为0。如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。
127.0.0.1:6379> get num "10" 127.0.0.1:6379> incrby num -5 (integer) 5 127.0.0.1:6379> get num "5" 127.0.0.1:6379> incrby num 10 (integer) 15 127.0.0.1:6379> get num "15"
数据减小
decrby 可以减小数值(也可以增加)
127.0.0.1:6379> get num "15" 127.0.0.1:6379> decrby num 8 (integer) 7 127.0.0.1:6379> get num "7" 127.0.0.1:6379> decrby num -10 (integer) 17 127.0.0.1:6379> get num "17"
列表list
列表是一个双向可读写的管道,其头部是左侧,尾部是右侧,一个列表最多可以包含2^32-
1(4294967295)个元素,下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,元素值可以重复,常用于存入日志等场景,此数据类型比较常用
列表特点
- 有序
- 可重复
- 左右都可以操作
生成列表并插入数据
LPUSH和RPUSH都可以插入列表
LPUSH key value [value …]
时间复杂度: O(1)
将一个或多个值 value 插入到列表 key 的表头
如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSmylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。
如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
当 key 存在但不是列表类型时,返回一个错误。
RPUSH key value [value …]
时间复杂度: O(1)
将一个或多个值 value 插入到列表 key 的表尾(最右边)。
如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、RPUSH mylist b 、 RPUSH mylist c 。
如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作。
当 key 存在但不是列表类型时,返回一个错误。
从左边添加数据,已添加的需向右移 127.0.0.1:6379> lpush name cold hot wide 根据顺序逐个写入name,最后的wide会在列表的最左侧 (integer) 3 127.0.0.1:6379> type name list 从右边添加数据 127.0.0.1:6379> rpush bianchen c java python go (integer) 4 127.0.0.1:6379> type bianchen list
向列表追加数据
127.0.0.1:6379> lpush name cool (integer) 4 从右边添加数据,已添加的向左移 127.0.0.1:6379> rpush bianchen javasprite (integer) 5
获取列表长度
127.0.0.1:6379> llen bianchen (integer) 5
获取列表指定位置数据
127.0.0.1:6379> rpush bianchen c java python go (integer) 4 127.0.0.1:6379> lindex bianchen 0 "c" 127.0.0.1:6379> lindex bianchen 3 "go" 127.0.0.1:6379> lindex bianchen -1 "javasprite"
127.0.0.1:6379> lpush name cold hot wide cool (integer) 3 127.0.0.1:6379> lrange name 0 -1 所有元素 1) "cool" 2) "wide" 3) "hot" 4) "cold" 127.0.0.1:6379> lrange name 0 3 所有元素 1) "cool" 2) "wide" 3) "hot" 4) "cold" 127.0.0.1:6379> lrange name 1 2 1) "wide" 2) "hot" 127.0.0.1:6379> rpush bianchen c java python go (integer) 4 127.0.0.1:6379> lrange bianchen 0 -1 1) "c" 2) "java" 3) "python" 4) "go" 5) "javasprite" 127.0.0.1:6379> lrange bianchen 1 2 1) "java" 2) "python" 127.0.0.1:6379> lrange bianchen 2 2 1) "python" 127.0.0.1:6379>
修改列表指定索引值
127.0.0.1:6379> lrange bianchen 0 -1 1) "c" 2) "java" 3) "python" 4) "go" 5) "javasprite" 127.0.0.1:6379> lset bianchen 4 php OK 127.0.0.1:6379> lrange bianchen 0 -1 1) "c" 2) "java" 3) "python" 4) "go" 5) "php"
移除列表数据
127.0.0.1:6379> lrange bianchen 0 -1 1) "c" 2) "java" 3) "python" 4) "go" 5) "php" 127.0.0.1:6379> lpop bianchen 弹出左边第一个元素,即删除最后一个 "c" 127.0.0.1:6379> lrange bianchen 0 -1 1) "java" 2) "python" 3) "go" 4) "php" 127.0.0.1:6379> rpop bianchen 弹出右边第一个元素,即删除第一个 "php" 127.0.0.1:6379> lrange bianchen 0 -1 1) "java" 2) "python" 3) "go" LTRIM 对一个列表进行修剪(trim),让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除 127.0.0.1:6379> llen bianchen (integer) 3 127.0.0.1:6379> lrange bianchen 0 -1 1) "java" 2) "python" 3) "go" 127.0.0.1:6379> ltrim bianchen 0 1 OK 127.0.0.1:6379> llen bianchen (integer) 2 127.0.0.1:6379> lrange bianchen 0 -1 1) "java" 2) "python" 删除list 127.0.0.1:6379> del name (integer) 1 127.0.0.1:6379> exist name (error) ERR unknown command `exist`, with args beginning with: `name`, 127.0.0.1:6379> exists name (integer) 0
集合 set
Set 是 String 类型的无序集合,集合中的成员是唯一的,这就意味着集合中不能出现重复的数据,可以在两个不同的集合中对数据进行对比并取值,常用于取值判断,统计,交集等场景,例如: 实现共同的朋友
集合特点
- 无序
- 无重复
- 集合间操作
生成集合key
127.0.0.1:6379> sadd game timi (integer) 1 127.0.0.1:6379> sadd music qq kugou (integer) 2 127.0.0.1:6379> type game set 127.0.0.1:6379> type music set
追加数值
追加时,只能追加不存在的数据,不能追加已经存在的数值 127.0.0.1:6379> sadd supper taobao jingdong (integer) 2 127.0.0.1:6379> sadd supper taobao 已存在的value,无法再次添加 (integer) 0 127.0.0.1:6379> sadd supper dewu (integer) 1
查看集合的所有数据
127.0.0.1:6379> smembers supper 1) "dewu" 2) "jingdong" 3) "taobao" 127.0.0.1:6379> smembers game 1) "timi"
删除集合中的元素
127.0.0.1:6379> smembers supper 1) "dewu" 2) "jingdong" 3) "taobao" 127.0.0.1:6379> srem supper jingdong (integer) 1 127.0.0.1:6379> smembers supper 1) "dewu" 2) "taobao"
获取集合的交集
交集:已属于A且属于B的元素称为A与B的交(集)
127.0.0.1:6379> smembers supper 1) "dewu" 2) "taobao" 127.0.0.1:6379> sadd goods taobao jingdong (integer) 2 127.0.0.1:6379> sinter goods supper 1) "taobao" 127.0.0.1:6379>
获取集合的并集
并集:已属于A或属于B的元素为称为A与B的并(集)
127.0.0.1:6379> sunion goods supper 1) "dewu" 2) "jingdong" 3) "taobao"
获取集合的差集
差集:已属于A而不属于B的元素称为A与B的差(集)
127.0.0.1:6379> sdiff goods supper 1) "jingdong" 127.0.0.1:6379> sdiff supper goods 1) "dewu" 127.0.0.1:6379> smembers goods 1) "jingdong" 2) "taobao" 127.0.0.1:6379> smembers supper 1) "dewu" 2) "taobao"
sorted set(有序集合)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double(双精度浮点型)类型的分数,redis正是通过该分数来为集合中的成员进行从小到大的排序,有序集合的成员是唯一的,但分数(score)却可以重复,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1), 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员),经常用于排行榜的场景
有序集合特点
- 有序
- 无重复元素
- 每个元素是由score和value组成
- score 可以重复
- value 不可以重复
生成有序集合
127.0.0.1:6379> zadd watch 1 flower (integer) 1 127.0.0.1:6379> zadd watch 2 dance (integer) 1 127.0.0.1:6379> zadd watch 4 juice (integer) 1 127.0.0.1:6379> type watch zset
有序集合实现排行榜
127.0.0.1:6379> zadd sore 145 math 101 english 130 chinese (integer) 3 127.0.0.1:6379> zrange sore 0 -1 正序排序后显示集合内所有的key,score从小到大显示 1) "english" 2) "chinese" 3) "math" 127.0.0.1:6379> zrevrange sore 0 -1 倒序排序后显示集合内所有的key,score从大到小显示 1) "math" 2) "chinese" 3) "english" 127.0.0.1:6379> zrange sore 0 -1 withscores 正序显示指定集合内所有key和得分情况 1) "english" 2) "101" 3) "chinese" 4) "130" 5) "math" 6) "145" 127.0.0.1:6379> zrevrange sore 0 -1 withscores 倒序显示指定集合内所有key和得分情况 1) "math" 2) "145" 3) "chinese" 4) "130" 5) "english" 6) "101"
返回某个数值的索引(排名)
127.0.0.1:6379> zrank sore english (integer) 0 127.0.0.1:6379> zrank sore math (integer) 2
获取集合的个数
127.0.0.1:6379> zcard sore (integer) 3
基于索引返回数值
127.0.0.1:6379> zrange sore 0 2 1) "english" 2) "chinese" 3) "math" 127.0.0.1:6379> zrange sore 0 7 超出范围不报错 1) "english" 2) "chinese" 3) "math" 127.0.0.1:6379> zrange sore 0 -1 1) "english" 2) "chinese" 3) "math"
获取分数
127.0.0.1:6379> zscore sore english "101"
删除元素
127.0.0.1:6379> zrange sore 0 -1 1) "english" 2) "chinese" 3) "math" 127.0.0.1:6379> zrem sore chinese (integer) 1 127.0.0.1:6379> zrange sore 0 -1 1) "english" 2) "math"
哈希 hash
晨晨 name hxc age 22 job 会计 city qinghai hash 即字典, 是一个string类型的字段(field)和值(value)的映射表,Redis 中每个 hash 可以存储 2^32 -1键值对,类似于字典,存放了多个k/v 对,hash特别适合用于存储对象场景
命令 复杂度 hget hset hdel o(1) hexists o(1) hincrby o(1) hgetall hvals hkeys o(1) hmget hmset o(1) 生成 hash key
HSET hash field value
时间复杂度: O(1)
将哈希表 hash 中域 field 的值设置为 value 。
如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作。
如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖。
127.0.0.1:6379> hset chenchen name hxc age 22 (integer) 2 127.0.0.1:6379> type chenchen hash 查看所有字段的值 127.0.0.1:6379> hgetall chenchen 1) "name" 2) "hxc" 3) "age" 4) "22" 增加字段 127.0.0.1:6379> hset chenchen job huaiji (integer) 1 127.0.0.1:6379> hgetall chenchen 1) "name" 2) "hxc" 3) "age" 4) "22" 5) "job" 6) "huaiji"
获取hash key的对应字段的值
127.0.0.1:6379> hget chenchen name "hxc" 127.0.0.1:6379> hmget chenchen name age 获取多个值 1) "hxc" 2) "22"
删除一个hash key 的对应字段
127.0.0.1:6379> hdel chenchen age (integer) 1 127.0.0.1:6379> hget chenchen age (nil) 127.0.0.1:6379> hgetall chenchen 1) "name" 2) "hxc" 3) "job" 4) "huaiji"
批量设置hash key的多个field和value
127.0.0.1:6379> hmset chenchen age 22 city qinghai OK 127.0.0.1:6379> hgetall chenchen 1) "name" 2) "hxc" 3) "job" 4) "huaiji" 5) "age" 6) "22" 7) "city" 8) "qinghai"
获取hash中指定字段的值
127.0.0.1:6379> hmget chenchen name age 1) "hxc" 2) "22"
获取hash中的所有字段名field
127.0.0.1:6379> hkeys chenchen 1) "name" 2) "job" 3) "age" 4) "city"
获取指定hash key 的所有field及value
127.0.0.1:6379> hvals chenchen 1) "hxc" 2) "huaiji" 3) "22" 4) "qinghai"
获取指定hash key 的所有field及value
127.0.0.1:6379> hgetall chenchen 1) "name" 2) "hxc" 3) "job" 4) "huaiji" 5) "age" 6) "22" 7) "city" 8) "qinghai"
删除 hash
127.0.0.1:6379> del chenchen (integer) 1 127.0.0.1:6379> exists chenchen (integer) 0 127.0.0.1:6379> hgetall chenchen (empty array)
还没有评论,来说两句吧...