前提:(key代表键)
命令 | 作用 |
---|---|
keys * | 查看当前库所有的key |
exists key | 判断某个key是否存在 |
type key | 查看key是什么类型 |
del key | 删除指定的key |
unlink key | 非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。 |
ttl key | 查看还有多少秒过期,-1表示永不过期,-2表示已过期 |
expire key 秒钟 | 为给定的key设置过期时间 |
move key dbindex[0-15] | 将当前数据库的key移动到给定的数据库db中 |
select dbindex[0-15] | 切换数据库【0-15】,默认为0 |
dbsize | 查看当前数据库key的数量 |
flushdb | 清空当前库(慎用) |
flushall | 通杀全部库(慎用) |
两个删除操作的区别:(unlink key 和 del key)
del key:是同步操作,执行时会立即阻塞当前线程,直到键被删除完成。
unlink key:是异步操作,它发起删除请求后不会阻塞线程,而是让删除操作在后台进行,不会立即返回键是否已成功删除。这样在处理大量键删除时,可以避免阻塞导致性能下降。
1.Redis字符串(String)
string是redis最基本的类型,一个key对应一个value,一个redis中字符串value最多可以是512M
string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象 。
(1)设置键值对:
set key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL]
NX:不存在时创建
XX:存在时创建(会覆盖前面的值,相当于修改k的值)
(2)keepttl作用:修改一个k的值会将原来的过期时间覆盖(值变了,但是过期时间也变了),keepttl可以保留原来的过期时间(只改变值,但是过期时间不变)
例:keepttl的使用
127.0.0.1:6379> set k1 v1 ex 30 设置k1过期时间为30s
OK
127.0.0.1:6379> set k1 v1kppl keepttl 修改k1的值,后面使用keepttl
OK
127.0.0.1:6379> ttl k1 获取k1过期时间
(integer) 8
127.0.0.1:6379> get k1
"v1kppl"
(3)在Java代码中获取当前Unix时间:
System.out.println(Long.toString(System.currentTimeMillis()/1000L));
(4)同时设置获取多个值:(mset)
使用:
127.0.0.1:6379> mset k1 v1 k2 v2
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> msetnx k2 v2 k3 v3 ----------(失败)
(integer) 0
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
注意:msetnx与事务类似,同成功,同失败(NX:不存在时创建,但是k2已经存在)
(5)获取和设置指定区间范围内的值:(getrange 和 setrange )
使用:
127.0.0.1:6379> get k1
"abcdefghijk"
127.0.0.1:6379> getrange k1 0 -1 0到-1代表全部
"abcdefghijk"
127.0.0.1:6379> getrange k1 0 3
"abcd"
127.0.0.1:6379> setrange k1 1 xxxx
(integer) 11
127.0.0.1:6379> get k1
"axxxxfghijk"
(6)数值增减(incr 、incrby 、decr 、decrby)
例如:
127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> get k1
"100"
127.0.0.1:6379> incr k1
(integer) 101
127.0.0.1:6379> incr k1
(integer) 102
127.0.0.1:6379> incrby k1 3 指定每次增加多少
(integer) 105
127.0.0.1:6379> incrby k1 3
(integer) 108
127.0.0.1:6379> decr k1
(integer) 107
127.0.0.1:6379> decr k1
(integer) 106
127.0.0.1:6379> decrby k1 3 指定每次减少多少
(integer) 103
127.0.0.1:6379> decrby k1 3
(integer) 100
(7)获取字符串长度和追加(str 、appebd)
例如:
127.0.0.1:6379> set k1 abcd
OK
127.0.0.1:6379> get k1
"abcd"
127.0.0.1:6379> strlen k1
(integer) 4
127.0.0.1:6379> append k1 xxxx
(integer) 8
127.0.0.1:6379> get k1
"abcdxxxx"
(8)分布式锁(setex key 过期时间 value (还有setnx))
第一步,set key value
第二步,expire k 过期时间
上面的两个加起来等同于:setex key 过期时间 value
例:
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> expire k1 10
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 6
127.0.0.1:6379> ttl k1
(integer) 2
127.0.0.1:6379> setex k1 10 vll
OK
127.0.0.1:6379> ttl k1
(integer) 0
127.0.0.1:6379> setnx k1 v11
(integer) 1
127.0.0.1:6379> get k1
"v11"
127.0.0.1:6379> setnx k1 v11
(integer) 0
(9)先获取再设置值(getset)
127.0.0.1:6379> getset k1 haha 先获取到原来的值v11,再修改为haha
"v11"
127.0.0.1:6379> get k1
"haha"
注意:getset命令等同于 set key value get ,例:
127.0.0.1:6379> get k1
"aaa"
127.0.0.1:6379> set k1 haha get
"aaa"
127.0.0.1:6379> get k1
"haha"
2.Redis列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
它的底层实际是个双端链表,最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
(1)创建和遍历列表(lpush 、rpush、lrange)
127.0.0.1:6379> LPUSH list1 1 2 3 4 5 6 从左边加入
(integer) 6
127.0.0.1:6379> RPUSH list2 1 2 3 4 5 6 从右边加入
(integer) 6
127.0.0.1:6379> LRANGE list1 0 -1 遍历
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> LRANGE list2 0 -1 遍历
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
(2)弹出元素(lpop、rpop)
127.0.0.1:6379> LPOP list1 左边弹出一个
"6"
127.0.0.1:6379> RPOP list1 右边弹出一个
"1"
127.0.0.1:6379> LRANGE list1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
(3)从上到下获取指定的元素(lindex)
127.0.0.1:6379> LINDEX list1 2
"3"
127.0.0.1:6379> LINDEX list1 0
"5"
(4)获取列表中元素的个数(llen)
127.0.0.1:6379> LLEN list1
(integer) 4
(5)删除N个值等于v1的元素(lrem key 数字N 给定的值v1)
127.0.0.1:6379> lpush list1 1 1 1 2 2 2 3 4 5 6
(integer) 10
127.0.0.1:6379> lrem list1 2 2 删除2个2
(integer) 2
127.0.0.1:6379> lrange list1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
7) "1"
8) "1"
(6)截取指定范围的值再赋值给key(ltrim key 开始index 结束index)
127.0.0.1:6379> lrange list1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> ltrim list1 0 2
OK
127.0.0.1:6379> lrange list1 0 -1
1) "6"
2) "5"
3) "4"
(7)将列表key1中的值加到列表key2中去(rpoplpush 列表key1 列表key2)
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> rpoplpush list1 list2 将list1中的4加到list2中去
"4"
127.0.0.1:6379> lrange list1 0 -1
1) "6"
2) "5"
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
(8)修改某个索引处的值(lset key index value)
127.0.0.1:6379> lset list2 2 9 将索引2的值改为9
OK
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "1"
3) "9"
4) "3"
5) "4"
6) "5"
7) "6"
(9)插入新的值(linsert key before/after 已有的值 插入新的值)
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "1"
3) "9"
4) "3"
5) "4"
6) "5"
7) "6"
127.0.0.1:6379> linsert list2 after 9 10 在9后面加一个10
(integer) 8
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "1"
3) "9"
4) "10"
5) "3"
6) "4"
7) "5"
8) "6"
默认插入前一个:
127.0.0.1:6381> linsert keylist after 3 6
(integer) 5
127.0.0.1:6381> lrange keylist 0 -1 keylist里面有两个3,只在第一个3后面加入了6
1) "3"
2) "6"
3) "2"
4) "3"
5) "1"
3.Redis哈希(Hash)
简单说就是:Map<String,Map<Object,Object>>
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)
(1)hset:为一个键赋值;hget:获取值
127.0.0.1:6381> hset user1 name tom age 18
(integer) 2
127.0.0.1:6381> hget user1 name
"tom"
(2)hmset:为多个属性赋值;hmget:获取多个属性的值
127.0.0.1:6381> hmset user2 name jack age 19
OK
127.0.0.1:6381> hmget user2 name age
1) "jack"
2) "19"
(3)hgetall:获取全部;hdel:删除某个属性
127.0.0.1:6381> hgetall user2
1) "name"
2) "jack"
3) "age"
4) "19"
127.0.0.1:6381> hdel user1 name
(integer) 1
(4)hlen:获取key的长度
127.0.0.1:6381> hlen user2
(integer) 2
(5)hexists key:判断key中有没有某一个属性
127.0.0.1:6381> hexists user2 name
(integer) 1
127.0.0.1:6381> hexists user2 email
(integer) 0
(6)hkeys:获取全部的属性 ;hvals:获取全部属性对应的值
127.0.0.1:6381> hkeys user2
1) "name"
2) "age"
127.0.0.1:6381> hvals user2
1) "jack"
2) "19"
(7)hincrby:属性增加;hincrbyfloat:增加小数;
127.0.0.1:6381> hincrby user2 age 2
(integer) 21
127.0.0.1:6381> hget user2 age
"21"
127.0.0.1:6381> hincrbyfloat user2 age 2.3
"23.3"
127.0.0.1:6381> hget user2 age
"23.3"
4.Redis集合(Set)
无重复
(1)sadd key member1 【member2】:向集合中加入多个成员
127.0.0.1:6381> sadd set1 1 1 2 2 3 4 5 6
(integer) 6
127.0.0.1:6381> sadd set2 3 4 5 6 7 8
(integer) 6
(2)scard key : 获取集合成员数
127.0.0.1:6381> scard set1
(integer) 6
(3)sdiff key1 【key2】:返回给定集合的差集
127.0.0.1:6381> sdiff set1 set2
1) "1"
2) "2"
(4)sdiffstore destination key1 【key2】:返回给定集合的差集并存储到destination中
127.0.0.1:6381> sdiffstore set3 set1 set2 将结果放入set3
(integer) 2
(5)sinter key1 【key2】:返回给定集合的交集
127.0.0.1:6381> sinter set1 set2
1) "3"
2) "4"
3) "5"
4) "6"
(6)sinterstore destination key1【key2】:返回给定集合的交集并存储到destination中
127.0.0.1:6381> sinterstore set3 set1 set2
(integer) 4
(7)sismember key member:判断member是不是key的成员
127.0.0.1:6381> sismember set1 1
(integer) 1
(8)smembers key:返回集合中全部的成员
127.0.0.1:6381> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
(9)smove source destination member :将member元素从source集合移动到destination中
127.0.0.1:6381> smove set2 set1 8
(integer) 1
127.0.0.1:6381> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "8"
(10)spop key 【count】 :移除并返回集合中的某count个元素(返回并删除)
127.0.0.1:6381> spop set1
"5"
127.0.0.1:6381> spop set1 2
1) "4"
2) "8"
(11)srandmember key 【count】:返回集合中一个或多个随机数(但是并未删除)
127.0.0.1:6381> srandmember set1 2
1) "3"
2) "6"
(12)srem key member1 【member2】:移除集合中一个或多个成员
127.0.0.1:6381> srem set1 1 2
(integer) 2
127.0.0.1:6381> smembers set1
1) "3"
2) "6"
(13)sunion key1 【key2】:返回给定集合的并集
127.0.0.1:6381> sunion set1 set2
1) "3"
2) "4"
3) "5"
4) "6"
5) "7"
(14)sunionstore destination key1 【key2】:返回给定集合的并集存在destination中
127.0.0.1:6381> sunionstore set4 set1 set2
(integer) 5
127.0.0.1:6381> smembers set4
1) "3"
2) "4"
3) "5"
4) "6"
5) "7"