Redis通常被称为数据结构服务器,因为值(value)可以是
字符串(String),
哈希(Map),
列表(list),
集合(sets)
有序集合(sorted sets)
1 String(字符串)
Redis 字符串是字节序列。Redis 字符串是二进制安全的,这意味着他们有一个已知的
示例:
redis 127.0.0.1:6379> SET name kevin (set key value结构)
OK
redis 127.0.0.1:6379> GET name
"kevin"
incr
让当前键值以 1 的数量递增,并返回递增后的值(key对应的value是整数),基于这个特性,在分布式系统中,使用其生成id使用
incrby
可以指定参数一次增加的数值,并返回递增后的值
decr
让当前键值以 1 的数量递减 并返回递减后的值
decrby
可以指定参数一次递减的数值,并返回递减后的值 incrbyfloat 可以递增一个双精度浮点数
append(类似于stringbuffer)
作用是向键值的末尾追加 value。如果键不存在则将该键的值设置为 value。返回值是追加后字符串的总长度。
mget/mset
作用与 get/set 相似,不过 mget/mset 可以同时获得/设置多个键的键值
del
根据 key 来删除 value
keys *
显示当前redis中所有的key
2 Hash(hash 哈希)
Redis 的哈希是键值对的集合。 Redis 的哈希值是字符串字段和字符串值之间的映射,因此它们被用来表示对象
示例:
redis 127.0.0.1:6379> HSET key field value
OK
redis 127.0.0.1:6379> HGET key field
value
hset 存储一个哈希键值对的集合
hset key field value
hget 获取一个哈希键的值
hget key field
hmset 存储一个或多个哈希是键值对的集合
hmset key field1 value1 ......fieldN keyN
hmget 获取多个指定的键的值
hmget key field1 ... fieldN
案例: 127.0.0.1:6379> hset person name xiaoming (integer) 1 127.0.0.1:6379> hget person name "xiaoming" 127.0.0.1:6379> hset person age 18 (integer) 1 127.0.0.1:6379> hget person age "18" 127.0.0.1:6379> hmset student class 101 no 1002 OK 127.0.0.1:6379> hmget student class no 1) "101" 2) "1002" 127.0.0.1:6379> hmget student (error) ERR wrong number of arguments for 'hmget' command 127.0.0.1:6379> |
hexists 判断哈希表中的字段名是否存在 如果存在返回 1 否则返回 0
hexists key field
案例: 127.0.0.1:6379> hexists student class (integer) 1 127.0.0.1:6379> hexists student name (integer) 0 |
hdel 删除一个或多个字段
hdel key field
案例: 127.0.0.1:6379> hdel student class (integer) 1 127.0.0.1:6379> hdel student class (integer) 0 127.0.0.1:6379> hget student class (nil) 127.0.0.1:6379> hget student no "1002" 127.0.0.1:6379> |
hgetall 获取一个哈希是键值对的集合
hgetall key
案例: 127.0.0.1:6379> hkeys student 1) "no" 2) "name" 3) "age" |
hlen 返回 key 的 hash 的元素(键值对)个数
hlen key
案例: 127.0.0.1:6379> hlens student 错误 (error) ERR unknown command 'hlens' 127.0.0.1:6379> hlen student (integer) 3 |
3 List(链表):先进先出原则
Redis 的链表是简单的字符串列表,排序插入顺序。您可以添加元素到 Redis 的列表的头部或尾部(可以理解为java中linkedlist)
使用场景:队列的特点:FIFO(先进的先出)
lpush key value 向链表左侧添加
rpush key value 向链表右侧添加
lrange key index1 index2 遍历链表:取index1到index2之间的元素
lrange c 0 -1 遍历整个c键中的元素-1代表索引最后一个
案例: 127.0.0.1:6379> lpush my a (integer) 1 127.0.0.1:6379> lpush my b (integer) 2 127.0.0.1:6379> lpush my c (integer) 3 127.0.0.1:6379> lrange my 0 10 1) "c" 2) "b" 3) "a" 127.0.0.1:6379> lrange my 0 -1 1) "c" 2) "b" 3) "a" 127.0.0.1:6379> rpush my e (integer) 4 127.0.0.1:6379> rpush my f (integer) 5 127.0.0.1:6379> rpush my j (integer) 6 127.0.0.1:6379> lrange my 0 -1 1) "c" 2) "b" 3) "a" 4) "e" 5) "f" 6) "j" 127.0.0.1:6379> lrange my 0 5 1) "c" 2) "b" 3) "a" 4) "e" 5) "f" 6) "j" //取出值并移除lpop ,rpop 127.0.0.1:6379> lpop my "c" 127.0.0.1:6379> lpop my "b" 127.0.0.1:6379> lrange my 0 -1 1) "a" 2) "e" 3) "f" 4) "j" 127.0.0.1:6379> rpop my "j" 127.0.0.1:6379> 127.0.0.1:6379> rpop my "3" 127.0.0.1:6379> rpop my "2" 127.0.0.1:6379> lrange my 0 -1 1) "b" 2) "a" 3) "1" 4) "2" |
lpop从链表的左边取数据,并且移除
rpop从链表的右边取数据,并且移除
lindex key indexnumber (从key值下标取出)如果要将链表类型当做数组来用,lindex 命令是必不可少的。
等同于数据中的Object get(int index)
lindex 命令用来返回指定索引的元素,索引从 0 开始
如果是负数表示从右边开始计算的索引,最右边元素的索引是-1。
类似于java中list.get(index)
4 Set(集合)Redis 的集合是字符串的无序集合。
sadd key value 添加一个 string 元素到,key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0
scard key 返回 set 的元素个数,如果 set 是空或者 key 不存在返回0
smembers key 返回 key 对应 set 的所有元素,结果是无序的(遍历set集合)
sismember key value 判断 value 是否在 set 中,存在返回 1,0 表示不存在或者 key 不存在
srem key value 从 key 对应 set 中移除给定元素,成功返回 1,如果 value 在集合中不存在或者 key 不存在返回 0
案例: 127.0.0.1:6379> sadd sore a (integer) 1 127.0.0.1:6379> sadd sore 2 (integer) 1 127.0.0.1:6379> sadd sore 5 (integer) 1 127.0.0.1:6379> sadd sore 5 (integer) 0 127.0.0.1:6379> sadd sore a (integer) 0 127.0.0.1:6379> scard sore (integer) 3 127.0.0.1:6379> sadd sore yu (integer) 1 127.0.0.1:6379> scard sore (integer) 4 127.0.0.1:6379> smembers sore 1) "a" 2) "5" 3) "2" 4) "yu" 127.0.0.1:6379> sismember sore a (integer) 1 127.0.0.1:6379> sismember sore 4 (integer) 0 127.0.0.1:6379> srem sore 5 (integer) 1 127.0.0.1:6379> smembers sore 1) "a" 2) "2" 3) "yu" 127.0.0.1:6379> srem sore xiaoli (integer) 1 |
5 SortedSet(有序集合)zset
Redis 的有序集合类似于 Redis 的集合,字符串不重复的集合。类似于java中LinkedHashSet
zadd key score value 将一个或多个 value 及其 score(索引)加入到 set 中:
先按score(分值,可以看做是索引,但是这个索引重复)排序,如果都为0,则按存入数据的字典顺序排序
遍历:zrange key start end: 0 和-1 表示从索引为 0 的元素到最后一个元素(同 LRANGE 命令相似)
案例: 127.0.0.1:6379> zadd me 0 a (integer) 1 127.0.0.1:6379> zadd me 2 b (integer) 1 127.0.0.1:6379> zadd me 4 c (integer) 1 127.0.0.1:6379> zrange me 0 -1 1) "a" 2) "b" 3) "c" 127.0.0.1:6379> zget me 0 (error) ERR unknown command 'zget' 127.0.0.1:6379> zadd me 1 e (integer) 1 127.0.0.1:6379> zrange me 0 -1 1) "a" 2) "e" 3) "b" 4) "c" 127.0.0.1:6379> zadd me 3 f (integer) 1 127.0.0.1:6379> zrange me 0 -1 1) "a" 2) "e" 3) "b" 4) "f" 5) "c" |
zrange key 0 -1 withscores 也可以连同 score 一块输出,使用 withscores 参数
案例: 127.0.0.1:6379> zrange me 0 -1 withscores 1) "a" 2) "0" 3) "e" 4) "1" 5) "b" 6) "2" 7) "f" 8) "3" 9) "c" 10) "4" |
zremrangebyscore key start end 可用于指定范围的删除操作
把指定分值上的value删除,如果有相同分值的都会被删除
案例: 127.0.0.1:6379> zrange me 0 -1 1) "a" 2) "e" 3) "b" 4) "f" 5) "c" 127.0.0.1:6379> zremrangebyscore me 0 1 (integer) 2 127.0.0.1:6379> zrange me 0 -1 1) "b" 2) "f" 3) "c" |
zset中排序由分值(索引)来维护,但是相同的分值(索引)时会按字典顺序排列
6Redis 中的其他命令
echo value 测试 redis 是否链接 如果已链接返回 echo 命令后给定的值 (相当于回音)
与ping-->PONG一样的意思
expire key time(s) 设置一个 key 的过期时间 单位秒。时间到达后会删除 key 及 value(使用场景:美团APP,电影票订单下单时候没有来得及支付,自动取消这个订单)
ttl key 查询已设置过期时间的 key 的剩余时间 如果返回-2 表示该键值对已经过期被删除
type key 查询key的数据类型
persist 移除给定 key 的过期时间
select dbindex 选择数据库(0-15)redis内默认有16个库,默认使用0库(select 1)
move key dbIndex 将当前数据库中的 key 转移到其他数据库中 (相当于是剪切)
dbsize 返回当前数据库中的 key 的数目 info 获取服务器的信息和统计
flushdb 删除当前库中的所有的key
flushall 删除所有16个数据库中的所有 key
quit 退出redis客户端与redis服务器的连接
./redis-cli shutdown 停止redis