Redis (three) data types
String
set/get/del/append/strlen
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> del k2
(integer) 1 #一般在redis中1代表执行成功,0代表执行失败
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> append k1 abc #追加文件数据
(integer) 5 #返回的字段总长度
127.0.0.1:6379> get k1
"v1abc"
127.0.0.1:6379> strlen k1 #查看key的长度
(integer) 5
incr/decr/incrby/decrby: addition and subtraction operation, the operation must be a number type
- The operation must be a number type
- decr: means decrement, decrease
127.0.0.1:6379> set k1 1 #写入key为k1的值为1
OK
127.0.0.1:6379> incr k1 #自增加1
(integer) 2 #返回自增之后的值
127.0.0.1:6379> incr k1
(integer) 3
127.0.0.1:6379> get k1
"3"
127.0.0.1:6379> decr k1 #自减减1
(integer) 2 #返回自减之后的值
127.0.0.1:6379> decr k1
(integer) 1
127.0.0.1:6379> get k1
"1"
127.0.0.1:6379> incrby k1 3 #在原来数据基础上加3
(integer) 4 #返回增加之后的数据
127.0.0.1:6379> get k1
"4"
127.0.0.1:6379> decrby k1 2 #在原来基础上减2
(integer) 2 #返回减后的数据
127.0.0.1:6379> get k1
"2"
getrange/setrange: similar to between...and...
- range: range
127.0.0.1:6379> set k1 abcdef
OK
127.0.0.1:6379> get k1
"abcdef"
127.0.0.1:6379> getrange k1 0 -1 #表示获取k1全部值
"abcdef"
127.0.0.1:6379> getrange k1 0 3 #表示获取k1小标0开始,到下标3的字符(包含0和3,一共返回4哥字符)
"abcd"
127.0.0.1:6379> setrange k1 1 xxx #表示将k1从下标1开始替换为xxx的值
(integer) 6
127.0.0.1:6379> get k1
"axxxef"
setex/setnx
-
set with expir: set the life cycle while adding data
127.0.0.1:6379> setex k1 5 v1 #添加一个key,设置他的生命周期为5秒 OK 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> get k1 (nil) #已过期
-
set if not exist: When adding data, judge whether it already exists, and prevent the existing data from being overwritten
127.0.0.1:6379> set k1 vi OK 127.0.0.1:6379> keys * 1) "k1" 127.0.0.1:6379> setnx k1 xiaoxing #在写入k1之前判断是否已经存在,防止覆盖原来数据 (integer) 0 #添加失败 127.0.0.1:6379> get k1 "vi"
mset/mget/msetnx
m: more
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #可以一次写多个值
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
127.0.0.1:6379> mget k1 k2 #可以一次获取多个值
1) "v1"
2) "v2"
127.0.0.1:6379> msetnx k1 b1 k4 v3 #再一次插入多个值之前判断是否存在,若有一个已经存在,则后面也不执行
(integer) 0 #插入失败
127.0.0.1:6379> msetnx k4 v4 k5 v5
(integer) 1
getset: get first and then set
127.0.0.1:6379> getset k6 v6 #先get在set
(nil)
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
3) "k5"
4) "k3"
5) "k4"
6) "k6"
127.0.0.1:6379> get k6
"v6"
127.0.0.1:6379> getset k6 vv6 #获取之后改值
"v6"
127.0.0.1:6379> get k6
"vv6"
List List
Push and pop, similar to machine gun AK47: push, press bullet, pop, shoot out bullet
-
lpush / rpush / lrange
-
l: left from left to right → add (add from top to bottom)
-
r: right Add from right to left← (add from bottom to top)
127.0.0.1:6379> lpush list01 1 2 3 4 5 #写入数组,从左往右,从上往下 (integer) 5 127.0.0.1:6379> keys * 1) "list01" 127.0.0.1:6379> lrange list01 0 -1 #获取数组,从下标0开始,-1表示结尾 1) "5" 2) "4" 3) "3" 4) "2" 5) "1" 127.0.0.1:6379> rpush list02 1 2 3 4 5 #写入数组,从右往左,从下往上 (integer) 5 127.0.0.1:6379> lrange list02 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5"
-
-
lpop/rpop: remove the first element (upper left, lower right)
127.0.0.1:6379> lpop list02 "1" 127.0.0.1:6379> lrange list02 0 -1 #从上面移除(左),一次移除一个 1) "2" 2) "3" 3) "4" 4) "5" 127.0.0.1:6379> rpop list02 "5" 127.0.0.1:6379> lrange list02 0 -1 #从下面移除(右),一次移除一个 1) "2" 2) "3" 3) "4"
-
lindex: Query elements based on subscripts (from left to right, top to bottom)
127.0.0.1:6379> lrange list01 0 -1 1) "5" 2) "4" 3) "3" 4) "2" 5) "1" 127.0.0.1:6379> lindex list01 2 #查询下标为2的,从上(左)往下(右)查 "3" 127.0.0.1:6379> lindex list01 1 #查询下标为1的,从上(左)往下(右)查 "4"
-
llen: returns the collection length
127.0.0.1:6379> lrange list01 0 -1 1) "5" 2) "4" 3) "3" 4) "2" 5) "1" 127.0.0.1:6379> llen list01 (integer) 5
-
lrem: delete n values
127.0.0.1:6379> clear 127.0.0.1:6379> lpush list01 1 2 2 3 3 3 4 4 4 4 (integer) 10 127.0.0.1:6379> lrem list01 2 3 #删除2个3,前面为个数,后面为对应value (integer) 2 127.0.0.1:6379> lrange list01 0 -1 1) "4" 2) "4" 3) "4" 4) "4" 5) "3" 6) "2" 7) "2" 8) "1"
-
ltrim: intercept the value of the specified range, throw away everything else
-
ltrim key begindex endindex
127.0.0.1:6379> lpush list01 1 2 3 4 5 6 7 8 9 (integer) 9 127.0.0.1:6379> lrange list01 0 -1 1) "9" 2) "8" 3) "7" 4) "6" 5) "5" 6) "4" 7) "3" 8) "2" 9) "1" 127.0.0.1:6379> ltrim list01 3 6 #截取下标3~6的值,别的全扔掉(从上往下) OK 127.0.0.1:6379> lrange list01 0 -1 1) "6" 2) "5" 3) "4" 4) "3"
-
-
rpoplpush: Get an element from one collection to another collection (one out from the right, one from the left)
127.0.0.1:6379> rpush list01 1 2 3 4 5 (integer) 5 127.0.0.1:6379> lrange list01 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 127.0.0.1:6379> rpush list02 1 2 3 4 5 (integer) 5 127.0.0.1:6379> lrange list02 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 127.0.0.1:6379> rpoplpush list01 list02 #将list01中值移入到list02中,右(上)出左(下)进 "5" 127.0.0.1:6379> lrange list01 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 127.0.0.1:6379> lrange list02 0 -1 1) "5" 2) "1" 3) "2" 4) "3" 5) "4" 6) "5"
-
lset: change a certain value of a certain subscript
lset key index value
127.0.0.1:6379> lrange list02 0 -1 1) "5" 2) "1" 3) "2" 4) "3" 5) "4" 6) "5" 127.0.0.1:6379> lset list02 0 x #该表list02下标0的值为x OK 127.0.0.1:6379> lrange list02 0 -1 1) "x" 2) "1" 3) "2" 4) "3" 5) "4" 6) "5"
-
linsert: Insert element (before/after an element is specified)
linsert key before/after oldvalue newvalue
127.0.0.1:6379> lrange list02 0 -1 1) "x" 2) "1" 3) "2" 4) "3" 5) "4" 6) "5" 127.0.0.1:6379> linsert list02 before 2 java #从左(上)边进入,在value为2之前插入java (integer) 7 127.0.0.1:6379> lrange list02 0 -1 1) "x" 2) "1" 3) "java" 4) "2" 5) "3" 6) "4" 7) "5" 127.0.0.1:6379> linsert list02 after 2 redis #从左(上)边进入,在value为2之前插入redis (integer) 8 127.0.0.1:6379> lrange list02 0 -1 1) "x" 2) "1" 3) "java" 4) "2" 5) "redis" 6) "3" 7) "4" 8) "5"
Performance summary: similar to adding train skins, the head and tail operation efficiency is high, and the middle operation efficiency is poor;
Set
Similar to the set characteristics in java, no duplication is allowed
-
sadd/smembers/sismember: add/view/judge whether it exists
127.0.0.1:6379> sadd set01 1 2 2 3 3 3 #像set插入数据 (integer) 3 127.0.0.1:6379> smembers set01 #获取数据,set不允许有重复 1) "1" 2) "2" 3) "3" 127.0.0.1:6379> sismember set01 2 #判断2的值是否存在于set集合 (integer) 1 #存在 127.0.0.1:6379> sismember set01 5 (integer) 0 #不存在
- Note: 1 and 0 are not subscripts, but Booleans. 1: true exists, 2: false does not exist
-
scard: get the number of elements in the set
127.0.0.1:6379> scard set01 (integer) 3
-
srem: delete elements in the collection
srem key value
127.0.0.1:6379> srem set01 2 (integer) 1 127.0.0.1:6379> smembers set01 1) "1" 2) "3"
-
srandmember: randomly get several elements from the set
srandmember integer (number)
127.0.0.1:6379> sadd set01 1 2 3 4 5 6 7 8 9 (integer) 9 127.0.0.1:6379> smembers set01 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 8) "8" 9) "9" 127.0.0.1:6379> srandmember set01 3 #随机在set集合中获取3个元素 1) "3" 2) "4" 3) "6"
-
spop: random pop (removed)
127.0.0.1:6379> spop set01 #随机移除 "3" 127.0.0.1:6379> spop set01 "2" 127.0.0.1:6379> smembers set01 1) "1" 2) "4" 3) "5" 4) "6" 5) "7" 6) "8" 7) "9"
-
smove: Move element: assign a value of key1 to key2
127.0.0.1:6379> sadd set01 1 2 3 4 5 (integer) 5 127.0.0.1:6379> sadd set02 a b c d e (integer) 5 127.0.0.1:6379> smove set01 set02 3 #将set01中的3移动到set02中 (integer) 1 127.0.0.1:6379> smembers set01 1) "1" 2) "2" 3) "4" 4) "5" 127.0.0.1:6379> smembers set02 1) "a" 2) "d" 3) "b" 4) "e" 5) "3" 6) "c"
-
Mathematical Collection
-
Intersection: sinter
-
Union: sunion
-
Difference: sdiff
127.0.0.1:6379> sadd set01 1 2 3 4 5 (integer) 5 127.0.0.1:6379> sadd set02 2 a 1 b 3 (integer) 5 127.0.0.1:6379> sinter set01 set02 #交集 1) "1" 2) "2" 3) "3" 127.0.0.1:6379> sunion set01 set02 #并集 1) "b" 2) "2" 3) "5" 4) "3" 5) "4" 6) "1" 7) "a" 127.0.0.1:6379> sdiff set01 set02 #差集,set01中存在,set02中不存在 1) "4" 2) "5" 127.0.0.1:6379> sdiff set02 set01 #差集,set02中存在,set01中不存在 1) "b" 2) "a"
-
Hash
Similar to Map<String,Object> in java
KV mode remains unchanged, but V is a key-value pair
-
hset/hget/hmset/hmget/hgetall/hdel: add/get/add more/get more/get all/delete attributes
127.0.0.1:6379> hset user id 1001 #写入K为user,V为id = 1001 (integer) 1 127.0.0.1:6379> hget user id #单个获取K为user,id的值 "1001" 127.0.0.1:6379> hmset student id 101 name tom age 22 #成批的写入 OK 127.0.0.1:6379> hget student name "tom" 127.0.0.1:6379> hmget student name age #获取多个 1) "tom" 2) "22" 127.0.0.1:6379> hgetall student #获取全部 1) "id" 2) "101" 3) "name" 4) "tom" 5) "age" 6) "22" 127.0.0.1:6379> hdel student age #删除student中V为age的数据 (integer) 1 127.0.0.1:6379> hgetall student 1) "id" 2) "101" 3) "name" 4) "tom"
-
hlen: returns the number of attributes of the element
127.0.0.1:6379> hlen student #属性个数,里面还有name和id属性 (integer) 2
-
hexists: Determine whether an element has an attribute
127.0.0.1:6379> hexists student name #查看是否有name属性 (integer) 1 #有 127.0.0.1:6379> hexists student age #查看是否有age属性 (integer) 0 #无
-
hkeys/hvals: get all the keys of the attribute/get all the values of the attribute
127.0.0.1:6379> hkeys student #获取所有属性 1) "id" 2) "name" 127.0.0.1:6379> hvals student #获取所有属性的值 1) "101" 2) "tom"
-
hincrby/hincrbyfloat: self-increment (integer) / self-increment (decimal)
127.0.0.1:6379> hmset student id 101 name tom age 22 OK 127.0.0.1:6379> hincrby student age 2 #student中age属性的值增加2 (integer) 24 127.0.0.1:6379> hget student age "24" 127.0.0.1:6379> hmset user id 1001 money 1000 OK 127.0.0.1:6379> hincrbyfloat user money 5.5 #user中money属性的值增加5.5(小数) "1005.5" 127.0.0.1:6379> hget user money "1005.5"
-
hsetnx: When adding, first determine whether it exists
127.0.0.1:6379> hsetnx student age 18 #写入前判断是否存在 (integer) 0 #存在,写入失败 127.0.0.1:6379> hsetnx student sex 男 (integer) 1 #不存在,写入成功 127.0.0.1:6379> hgetall student 1) "id" 2) "101" 3) "name" 4) "tom" 5) "age" 6) "24" 7) "sex" 8) "\xe7\x94\xb7" #可以添加中文,但是显示编码不对,后续可使用Java转换
Ordered set Zset
Real demand:
Top up 10 yuan to enjoy vip1;
Charge 20 yuan to enjoy vip2;
Recharge 30 yuan to enjoy vip3;
And so on...
-
zadd/zrange (withscores): add/query
127.0.0.1:6379> zadd zset01 10 vip1 20 vip2 30 vip3 40 vip4 50 vip5 (integer) 5 127.0.0.1:6379> zrange zset01 0 -1 #查询数据 1) "vip1" 2) "vip2" 3) "vip3" 4) "vip4" 5) "vip5" 127.0.0.1:6379> zrange zset01 0 -1 withscores #携带分数查询数据 1) "vip1" 2) "10" 3) "vip2" 4) "20" 5) "vip3" 6) "30" 7) "vip4" 8) "40" 9) "vip5" 10) "50"
-
zrangebyscore: fuzzy query
-
(: Does not contain
-
limit: skip several interceptions
127.0.0.1:6379> zrangebyscore zset01 20 40 #查询分数在20到40之间的数据,包括20和40 1) "vip2" 2) "vip3" 3) "vip4" 127.0.0.1:6379> zrangebyscore zset01 20 (40 #查询分数在20到40之间的数据,包括20,但是不包括40 1) "vip2" 2) "vip3" 127.0.0.1:6379> zrangebyscore zset01 (20 (40 #查询分数在20到40之间的数据,不包括20和40 1) "vip3" 127.0.0.1:6379> zrangebyscore zset01 10 40 limit 2 2 #查询分数在10到40之间的数据,跳过2条,显示2条 1) "vip3" 2) "vip4"
-
-
zrem: delete element
127.0.0.1:6379> zrem zset01 vip5 (integer) 1 127.0.0.1:6379> zrange zset01 0 -1 1) "vip1" 2) "vip2" 3) "vip3" 4) "vip4"
-
zcard/zcount/zrank/zscore: collection length/number of elements in the range/subscript of the element/pass value score
127.0.0.1:6379> zcard zset01 #获取集合长度 (integer) 4 127.0.0.1:6379> zcount zset01 20 30 #获取分数在20和30之间的元素个数,包括20和30 (integer) 2 127.0.0.1:6379> zrank zset01 vip3 #获取元素的下标(从上往下) (integer) 2 127.0.0.1:6379> zscore zset01 vip2 #获取元素的分数 "20"
-
zrevrank: Find the subscript in reverse order (from bottom to top)
127.0.0.1:6379> zrevrank zset01 vip3 #逆序找下标(从下向上) (integer) 1
-
zrevrange: reverse order query
127.0.0.1:6379> zrange zset01 0 -1 #顺序查询,从上往下 1) "vip1" 2) "vip2" 3) "vip3" 4) "vip4" 127.0.0.1:6379> zrevrange zset01 0 -1 #逆序查询,从下往上查询 1) "vip4" 2) "vip3" 3) "vip2" 4) "vip1"
-
zrevrangebyscore: reverse range search
127.0.0.1:6379> zrevrangebyscore zset01 30 20 #逆序分数查询30~20,分数要逆序来(注意:先写大值,后写小值) 1) "vip3" 2) "vip2" 127.0.0.1:6379> zrevrangebyscore zset01 20 30 (empty list or set)