127.0.0.1:6379> set key1 v1 # 设置值
OK
127.0.0.1:6379> get key1 # 获取指定key的值
"v1"
127.0.0.1:6379> exists key1 # 判断指定的key是否存在
(integer) 1
127.0.0.1:6379> append key1 hello # 给指定的key追加字符串,若key不存在,则就相当于set命令
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> strlen key1 # 获取指定key的长度
(integer) 7
现在我们思考个场景,就是常见的文章的浏览量以及点赞评论量,怎么用redis来实现?
这里我们在redis中模拟下
127.0.0.1:6379> set views 0 # 先设置一个值,表示浏览量,初始为0
OK
127.0.0.1:6379> get views # 查看值,为0
"0"
127.0.0.1:6379> incr views # 将指定的key的值 +1
(integer) 1
127.0.0.1:6379> get views # 查看值,为1
"1"
127.0.0.1:6379> incr views # 将指定的key的值 +1
(integer) 2
127.0.0.1:6379> get views # 查看值,为2
"2"
127.0.0.1:6379> decr views # 将指定的key值 -1
(integer) 1
127.0.0.1:6379> get views # 查看值,为1
"1"
127.0.0.1:6379> decr views # 将指定的key值 -1
(integer) 0
127.0.0.1:6379> get views # 查看值,为0
"0"
那我们继续思考,如果一次不是 +1 ,而是要 +指定的数字怎么办呢?比如说 一次 浏览量就 +10,获取取消点赞,点赞量 -5
127.0.0.1:6379> get views # 查看值,值为0,即初始的值
"0"
127.0.0.1:6379> incrby views 10 # 将指定的key的值 +10
(integer) 10
127.0.0.1:6379> get views # 查看值,值为10
"10"
127.0.0.1:6379> decrby views 5 # 将指定的key的值 -5
(integer) 5
127.0.0.1:6379> get views # 查看值,值为5
"5"
127.0.0.1:6379> set key1 hello,zhan # 设置一个值
OK
127.0.0.1:6379> get key1 # 获取指定key的值
"hello,zhan"
127.0.0.1:6379> getrange key1 0 2 # 获取指定key的值,并且值的下标从0到2截取,包含0和2
"hel"
127.0.0.1:6379> get key1
"hello,zhan"
127.0.0.1:6379> setrange key1 6 he # 将指定的key的下标为6开始的字符,替换为he,注意,是一个字符一个字符替换,超过的不替换
(integer) 10
127.0.0.1:6379> get key1 # 获取值,这里发现,原来的zh替换为了he,而an不变
"hello,hean"
setex:set with expire 设置过期时间
setnx:set if not exist 不存在则设置,这里可以被用来作为分布式锁
127.0.0.1:6379> setex key1 30 hello # 这是一个key,并设置30秒有效期,值为hello,key 为 key1
OK
127.0.0.1:6379> ttl key1 # 查看指定key的有效期
(integer) 27
127.0.0.1:6379> setnx key2 hi # 如果key2这个key不存在,就创建,值为hi
(integer) 1
127.0.0.1:6379> keys *
1) "key2"
2) "key1"
127.0.0.1:6379> ttl key1 # 查看指定key的有效期,这里结果为-2,已经过期了
(integer) -2
127.0.0.1:6379> keys *
1) "key2"
127.0.0.1:6379> setnx key2 hello # 如果key2这个key不存在,就创建,值为hello
(integer) 0
127.0.0.1:6379> get key2 # 获取key2的值,发现值为hi,即刚刚执行的setnx没有覆盖掉值
"hi"
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 批量设置,以 key1 value1 key2 value2...的顺序设置
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> get k3
"v3"
127.0.0.1:6379> mget k1 k2 k3 # 批量获取多个key的值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 vv k4 v4 # 批量使用setnx命令,注意,这是一个原子性操作,要么一起设置成功,要么一起设置失败
(integer) 0
127.0.0.1:6379> keys * # 查看所有的key,这里发现没有k4
1) "k3"
2) "k2"
3) "k1"
getset:先get然后再set
127.0.0.1:6379> getset k1 v1 # 这里第一次使用时,没有k1这个key,所以返回的null,然后再将v1设置进去
(nil)
127.0.0.1:6379> get k1 # 这里可以看到v1这个值已经写进这个key了
"v1"
127.0.0.1:6379> getset k1 v2 # 这里再使用时,先获取k1的值,是v1返回,然后再将v2设置替换进去
"v1"
这里有些像Java中的CAS,比较并交换。
redis中,可以把List类型做成栈、队列或阻塞队列
127.0.0.1:6379> lpush list one # 将一个或多个值,插入到key为list的列表的头部(即左侧)
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1 # 获取key为 list的全部的值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1 # 获取key为 list的第0到1个元素的值
1) "three"
2) "two"
127.0.0.1:6379> lpush list2 one two three
(integer) 3
127.0.0.1:6379> lrange list2 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> rpush list3 one # 将一个或多个值,插入到key为list的列表的尾部(即右侧)
(integer) 1
127.0.0.1:6379> rpush list3 two
(integer) 2
127.0.0.1:6379> rpush list3 three
(integer) 3
127.0.0.1:6379> lrange list3 0 -1 # 这里的返回结果可以和上面lpush后的返回结果对比下
1) "one"
2) "two"
3) "three"
首先我们看,插入值时有两种插入,头插法和尾插法,分别对应lpush和rpush,那么移除值的时候有没有两种呢?肯定是有的
127.0.0.1:6379> lrange list1 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lpop list1 # 将头元素移除
"three"
127.0.0.1:6379> lrange list1 0 -1
1) "two"
2) "one"
127.0.0.1:6379> rpop list1 # 将尾元素移除
"one"
127.0.0.1:6379> lrange list1 0 -1
1) "two"
那么我想移除指定的值呢?
127.0.0.1:6379> lpush list one one two three # 事先放一些值
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "one"
127.0.0.1:6379> lrem list 1 two # 将key为 list 的集合中移除1个值为 two的元素
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "one"
3) "one"
127.0.0.1:6379> lrem list 2 one # 将key为 list 的集合中移除2个值为 one的元素
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "three"
127.0.0.1:6379> lpush list one two three
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lindex list 0 # 获取key为list的下标为0的值
"three"
127.0.0.1:6379> lindex list 2 # 获取key为list的下标为2的值
"one"
127.0.0.1:6379> llen list # 返回指定key的长度
(integer) 3
127.0.0.1:6379> rpush list 1 2 3 4 5 # 初始化一些值
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> ltrim list 1 2 # 将key为 list的集合的下标为 1 到 2的元素截取,其余的丢掉
OK
127.0.0.1:6379> lrange list 0 -1
1) "2"
2) "3"
127.0.0.1:6379> rpush list 1 2 3 # 初始化值
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> rpoplpush list otherlist # 将key为list的集合的尾部元素弹出并push到key为otherlist的集合中,若otherlist集合不存在,则新建
"3"
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "2"
127.0.0.1:6379> lrange otherlist 0 -1
1) "3"
127.0.0.1:6379> lpush list 1 2 3
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lset list 0 4 # 将key为 list 的下标为0 的值更新为 4
OK
127.0.0.1:6379> lrange list 0 -1
1) "4"
2) "2"
3) "1"
127.0.0.1:6379> rpush list 1 2 3
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> linsert list before 1 0 # 在key为 list 的集合中的值为 1的元素前面插入一个值为0的元素
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
127.0.0.1:6379> linsert list after 3 4 # 在key为 list 的集合中的值为3的元素后面插入一个值为4的元素
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
127.0.0.1:6379> sadd myset hello # 向key为 myset中添加值 hello
(integer) 1
127.0.0.1:6379> sadd myset he
(integer) 1
127.0.0.1:6379> sadd myset hi
(integer) 1
127.0.0.1:6379> smembers myset # 查看指定key的值
1) "hi"
2) "he"
3) "hello"
127.0.0.1:6379> SISMEMBER myset hello # 查看 myset 这个 key有没有一个叫 hello的值,结果>0 则表示有,如果为0则没有
(integer) 1
127.0.0.1:6379> scard myset # 查看指定key的set有几个元素
(integer) 3
127.0.0.1:6379> sadd myset ya
(integer) 1
127.0.0.1:6379> scard myset
(integer) 4
127.0.0.1:6379> srem myset hello ya # 移除 key 为 myset的hello 和 ya元素
(integer) 2
127.0.0.1:6379> smembers myset
1) "hi"
2) "he"
这里可以从redis存储的一个set集合中随机抽取元素
127.0.0.1:6379> SMEMBERS myset # 这里事先初始化了五个元素
1) "hi"
2) "he"
3) "ya"
4) "hello"
5) "zhan"
127.0.0.1:6379> SRANDMEMBER myset # 在key为myset的set集合中,随机抽选一个元素
"he"
127.0.0.1:6379> SRANDMEMBER myset
"zhan"
127.0.0.1:6379> SRANDMEMBER myset 2 # 在key为myset的set集合中,随机抽选两个元素
1) "he"
2) "hello"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "hello"
2) "zhan"
127.0.0.1:6379> SMEMBERS myset # 事先初始化了一个key
1) "hi"
2) "he"
3) "hello"
4) "ya"
5) "zhan"
127.0.0.1:6379> spop myset 2 # 从key为myset的set中随机移除两个元素
1) "ya"
2) "he"
127.0.0.1:6379> spop myset # 从key为myset的set中随机移除一个元素
"zhan"
127.0.0.1:6379> SMEMBERS myset
1) "hi"
2) "hello"
127.0.0.1:6379> SMEMBERS myset # 事先初始化一个key
1) "hi"
2) "he"
3) "ya"
4) "hello"
5) "zhan"
127.0.0.1:6379> smove myset myset2 hi # 将key为 myset的set集合中的值为hi的元素移动到 key 为 myset2的set中
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "he"
2) "ya"
3) "hello"
4) "zhan"
127.0.0.1:6379> SMEMBERS myset2
1) "hi"
127.0.0.1:6379> sadd key1 a b c
(integer) 3
127.0.0.1:6379> sadd key2 c d e
(integer) 3
127.0.0.1:6379> sdiff key1 key2 # 获取key1 - key2的元素,即key1这个set中哪些元素是在key2中没有的
1) "b"
2) "a"
127.0.0.1:6379> SINTER key1 key2 # 获取 key1和key2这两个set的交集
1) "c"
127.0.0.1:6379> SUNION key1 key2 # 获取key1 和 key2这两个set的并集
1) "e"
2) "a"
3) "c"
4) "b"
5) "d"
这里的应用场景:
可以找社交网站中两个人有哪些共同关注的,或者共同好友,这里可以用交集来实现;
还可以找有哪些是你关注了但他还没关注的,这里可以用差集来实现。
这里基本上就是常见的map集合
127.0.0.1:6379> hset myhash f1 v1 f2 v2 # 设置一个key为myhash的map集合,值是{"f1":"v1","f2":"v2"}
(integer) 2
127.0.0.1:6379> hget myhash f1 # 获取key为myhash的hash中f1字段的值
"v1"
127.0.0.1:6379> hmget myhash f1 f2 # 获取key为myhash的hash中f1和f2字段的值
1) "v1"
2) "v2"
127.0.0.1:6379> hgetall myhash # 获取key为myhash的全部的值,展示形式为 key value key value
1) "f1"
2) "v1"
3) "f2"
4) "v2"
127.0.0.1:6379> hset myhash f2 v3 # 这里再次设置f2的值,可以覆盖
(integer) 0
127.0.0.1:6379> hget myhash f2
"v3"
127.0.0.1:6379> hgetall myhash # 实现初始化一个hash
1) "f1"
2) "v1"
3) "f2"
4) "v2"
127.0.0.1:6379> hdel myhash f1 # 删除key为myhash中的f1字段,包括值也删
(integer) 1
127.0.0.1:6379> hgetall myhash # 这里就可以看到f1字段和值都没有了
1) "f2"
2) "v2"
127.0.0.1:6379> hlen myhash # 获取key为myhash的字段数量
(integer) 1
127.0.0.1:6379> HEXISTS myhash f1 # 判断key为myhash中是否存在f1字段,值为0则不存在
(integer) 0
127.0.0.1:6379> HEXISTS myhash f2 # 判断key为myhash中是否存在f2字段
(integer) 1
127.0.0.1:6379> hkeys myhash # 获取key为myhash中所有的字段
1) "f2"
127.0.0.1:6379> hvals myhash # 获取key为myhash中所有的value
1) "v2"
127.0.0.1:6379> hset myhash f1 1 # 初始化一个key
(integer) 1
127.0.0.1:6379> hget myhash f1
"1"
127.0.0.1:6379> HINCRBY myhash f1 1 # 将key为myhash的f1字段的值 +1
(integer) 2
127.0.0.1:6379> hget myhash f1
"2"
127.0.0.1:6379> HINCRBY myhash f1 2 # 将key为myhash的f1字段的值 +2
(integer) 4
127.0.0.1:6379> hget myhash f1
"4"
127.0.0.1:6379> HINCRBY myhash f1 -1 # 将key为myhash的f1字段的值 -1
(integer) 3
127.0.0.1:6379> hget myhash f1
"3"
127.0.0.1:6379> HINCRBY myhash f1 -2 # 将key为myhash的f1字段的值 -2
(integer) 1
127.0.0.1:6379> hget myhash f1
"1"
127.0.0.1:6379> hsetnx myhash f2 v2 # 若key为myhash中不存在f2字段,则set一个f2对应的key-value
(integer) 1
127.0.0.1:6379> hget myhash f2
"v2"
127.0.0.1:6379> hsetnx myhash f2 v3 # 这里已经存在了,所以就不会再设置值了
(integer) 0
127.0.0.1:6379> hget myhash f2 # 值没有被替换
"v2"
这个其实和set差不多,只不过在添加的时候,多了一个参数,即顺序
127.0.0.1:6379> zadd myset 1 one # 向key为myset的Zset中添加一个顺序为1的值one
(integer) 1
127.0.0.1:6379> zadd myset 2 two # 向key为myset的Zset中添加一个顺序为2的值two
(integer) 1
127.0.0.1:6379> zadd myset 3 three 4 four # 向key为myset的Zset中添加一个顺序为3的值three 和一个顺序为4的值four
(integer) 2
127.0.0.1:6379> zrange myset 0 -1 # 范围查询
1) "one"
2) "two"
3) "three"
4) "four"
这里模拟一个人员发薪资,然后按薪资的正序排序和逆序排序
127.0.0.1:6379> zadd myset 2300 zhangsan
(integer) 1
127.0.0.1:6379> zadd myset 2600 lisi
(integer) 1
127.0.0.1:6379> zadd myset 5000 zhan
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE myset -inf +inf # 为key为myset的Zset排序,排序的范围为-inf(负无穷) 到 +inf(正无穷)
1) "zhangsan"
2) "lisi"
3) "zhan"
127.0.0.1:6379> ZRANGEBYSCORE myset -inf +inf withscores # 为key为myset的Zset排序,排序的范围为-inf(负无穷) 到 +inf(正无穷),并且带上序号,这里的含义为带上薪资
1) "zhangsan"
2) "2300"
3) "lisi"
4) "2600"
5) "zhan"
6) "5000"
127.0.0.1:6379> ZREVRANGEBYSCORE myset +inf -inf # 为key为myset的Zset逆序排序,排序的范围为+inf(正无穷) 到 -inf(负无穷)
1) "zhan"
2) "lisi"
3) "zhangsan"
127.0.0.1:6379> ZRANGEBYSCORE myset -inf 3000 withscores # 为key为myset的Zset排序,排序的范围为-inf(负无穷) 到 3000,即薪资小于3000的,并且带上序号,这里的含义为带上薪资
1) "zhangsan"
2) "2300"
3) "lisi"
4) "2600"
127.0.0.1:6379> zrange myset 0 -1
1) "zhangsan"
2) "lisi"
3) "zhan"
127.0.0.1:6379> zrem myset zhangsan lisi # 从key为myset的Zset中移除zhangsan和lisi
(integer) 2
127.0.0.1:6379> zrange myset 0 -1
1) "zhan"
127.0.0.1:6379> zcard myset # 查看key为myset的元素个数
(integer) 1
127.0.0.1:6379> zadd myset 1 v1 2 v2 3 v3
(integer) 3
127.0.0.1:6379> zrange myset 0 -1
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> zcount myset 1 3 # 查看key为myset中 序号为 1 到 3之间元素的个数
(integer) 3