看了江南一点雨的文章感觉不错,决定怒打20行代码

# 启动服务
redis-server.exe redis.windows.conf
# 进入命令行
双击redis-cli.exe

五大数据类型介绍

redis中的数据都是以key/value的形式存储的,五大数据类型主要是指value的数据类型,包含如下五种:

STRING

STRING是redis中最基本的数据类型,redis中的STRING类型是二进制安全的,即它可以包含任何数据,比如一个序列化的对象甚至一个jpg图片,要注意的是redis中的字符串大小上限是512M。

LIST

LIST是一个简单的字符串列表,按照插入顺序进行排序,我们可以从LIST的头部(LEFT)或者尾部(RIGHT)插入一个元素,也可以从LIST的头部(LEFT)或者尾部(RIGHT)弹出一个元素。

HASH

HASH类似于Java中的Map,是一个键值对集合,在redis中可以用来存储对象。

SET

SET是STRING类型的无序集合,不同于LIST,SET中的元素不可以重复。

ZSET

ZSET和SET一样,也是STRING类型的元素的集合,不同的是ZSET中的每个元素都会关联一个double类型的分数,ZSET中的成员都是唯一的,但是所关联的分数可以重复。

127.0.0.1:6379> set k1 v1
(error) NOAUTH Authentication required. # 未登录,需要登录
127.0.0.1:6379> auth 123456 # 输入密码即可登录
OK
# 设置值与取值
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
#DEL命令
#看到OK表示插入成功。通过DEL命令我们可以删除一个已经存在的key
127.0.0.1:6379> del k1
(integer) 1 # 删除成功
127.0.0.1:6379> del k1
(integer) 0 # 删除失败
# del还可以删除多个key,返回被删除成功的个数
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> del k1 k2 k3 k4 # 删除键1234,其中k4是不存在的
(integer) 3 # 成功删除了3个键,k4是不存在的
# dump可以序列化给定的key,返回序列化过后的值,key为空时返回nil
127.0.0.1:6379> dump k1
(nil)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> dump k1
"\x00\x02v1\a\x00\xa0\xd7e\xad\xc3\x9a\xacA"    #k1被序列化的值
127.0.0.1:6379> get k1
"v1"
# EXISTS命令用来检测一个给定的key是否存在,可以同时判断多个键是否存在,返回存在的键个数
127.0.0.1:6379> EXISTS k1 
(integer) 1
127.0.0.1:6379> exists k1 k2 k3 #多键判断是否存在
(integer) 1
127.0.0.1:6379> set k2 v2 # 新增一个键k2
OK
127.0.0.1:6379> exists k1 k2 k3
(integer) 2 # 此时返回2
# keys * 获取所有存在的键,后面跟正则表达式
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> ttl k1
(integer) -1 # -1表示key存在并且没有设置过期时间(永久有效)
127.0.0.1:6379> ttl k3
(integer) -2 # -2表示key不存在或者已过期
# EXPIRE命令可以给key设置有效期,在有效期过后,key会被销毁
127.0.0.1:6379> expire k2 10 # 给k2设置10秒过期
(integer) 1 # 返回1设置成功
127.0.0.1:6379> get k2 # 10s过后k2被删除了
(nil)
127.0.0.1:6379> keys * # 果然被删除了
1) "k1"
# 给k1设置6分钟的过期时间
127.0.0.1:6379> expire k1 360
(integer) 1
127.0.0.1:6379> ttl k1 # 使用ttl查看剩余的过去时间
(integer) 351
127.0.0.1:6379> ttl k1
(integer) 211 # 我又看了一下,发现它快过去了
# PERSIST命令移除键的过期时间,设置永不过期
127.0.0.1:6379> persist k1 #我想拯救一下生命快结束的k1
(integer) 1 # 拯救成功
127.0.0.1:6379> ttl k1
(integer) -1 # 确实永不过期了
127.0.0.1:6379> persist k2 # 我也想拯救一下已经死了的k2
(integer) 0 # 果然死了不能复生
127.0.0.1:6379> ttl k2
(integer) -2 # k2已经被销毁了,想要挽回已经无能为力,且行且珍惜吧
# pexpire设置key的过期时间不同的是,它后面跟毫秒数
127.0.0.1:6379> pexpire k1 60000 # 设置1分钟的过期时间
# PTTL 可以查看key的有效时间,返回毫秒数
127.0.0.1:6379> pttl k1 #查看过期时间:毫秒数
(integer) 38022
127.0.0.1:6379> ttl k1 # 配合ttl更高效
(integer) 29
# clear可以清屏,方便下面的操作

String

append:如果key已经存在,则会直接在value后追加值,如果key不存在,则会先创建一个value为空字符串的key,然后再追加

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> append k1 qfmx #创建k1,并且追加qfmx
(integer) 4 #返回k1的字符个数
127.0.0.1:6379> get k1
"qfmx"
127.0.0.1:6379> append k1 5201314 #我想再追加7个字符
(integer) 11    #此时k1有11个字符
127.0.0.1:6379> get k1
"qfmx5201314"
##为啥要用append呢?set不香吗?
127.0.0.1:6379> set k2    #果然k2必须要赋值
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set k2 "" # 赋值为空字符串完美
OK
127.0.0.1:6379> get k2 
""
127.0.0.1:6379> append k2 qfmx # 同样的效果
(integer) 4
127.0.0.1:6379> set k3 null # 好像null被解析成了字符串
OK
127.0.0.1:6379> get k3 # 是字符串而不是null(空)
"null"
127.0.0.1:6379> append k3 qfmx
(integer) 8 # 果然
127.0.0.1:6379> get k3
"nullqfmx"

decr:命令可以实现对value的减1操作,如果key不存在,则key对应的初始值会被置为0,如果key的value不为数字,则会报错

decrby:对key进行减decrement 操作-》语法【DECRBY key decrement 】decrement为正数 则递减decrement个值,为负数则增加decrement个值,decrement不能为浮点数

127.0.0.1:6379> decr k5 # 等同于先创建set k5 0 然后再减1
(integer) -1 # 返回k5被减后的值
127.0.0.1:6379> get k5
"-1"
127.0.0.1:6379> decr k5
(integer) -2
127.0.0.1:6379> decr k5
(integer) -3 # 返回k5被减后的值
127.0.0.1:6379> get k5
"-3" # 果然没错
127.0.0.1:6379> DECRBY k5 20
(integer) -23
#127.0.0.1:6379> DECRBY key decrement 
127.0.0.1:6379> get k5
"-3"
127.0.0.1:6379> DECRBY k5 20 # 递减20
(integer) -23
127.0.0.1:6379> DECRBY k5 -20 # 递增20
(integer) -3
127.0.0.1:6379> DECRBY k5 0 # 没变化啊,不增不减
(integer) -3
127.0.0.1:6379> DECRBY k5 10.5 # 不能为浮点数哦
(error) ERR value is not an integer or out of range
# 也不能对非整数进行操作
127.0.0.1:6379> set k4 2.5
OK
127.0.0.1:6379> decr k4
(error) ERR value is not an integer or out of range
127.0.0.1:6379> decr k1
(error) ERR value is not an integer or out of range
127.0.0.1:6379> decrby k1 10
(error) ERR value is not an integer or out of range
127.0.0.1:6379> get k1
"qfmx5201314"

GETRANGE:用来返回key所对应的value的子串,子串由start和end决定,从左往右计算,如果下标是负数,则从右往左计算,其中-1表示最后一个字符,-2是倒数第二个

127.0.0.1:6379> GETRANGE k1 0 -1 # 获取所有字符串
"qfmx5201314"
127.0.0.1:6379>  GETRANGE k1 -10 -1 # 取倒数10个
"fmx5201314"
127.0.0.1:6379> GETRANGE k1 0 1 # 取钱2个
"qf"
127.0.0.1:6379> GETRANGE k1 0 11 # 正取所有
"qfmx5201314"
127.0.0.1:6379> GETRANGE k1 0 100 # 终点(100)大了没关系,多跑了没关系,也是跑完了
"qfmx5201314"
127.0.0.1:6379> GETRANGE k1 -100 -1 # 起点低没关系,努力到了终点(-1)就好
"qfmx5201314"

set 重置key,相当于重新赋值

getset 重置key,返回被重置的字符串,再赋值新的值

127.0.0.1:6379> get k1 # k1
"qfmx5201314"
127.0.0.1:6379> set k1 12345 # set重新赋值
OK
127.0.0.1:6379> get k1 # k1已经被赋值
"12345"
127.0.0.1:6379> getset k1 qfmx # getset悄悄赋值,先返回k1上一次的值
"12345"
127.0.0.1:6379> get k1 # k1已经被赋值
"qfmx"
127.0.0.1:6379> getset hellp 12435 # key hellp以前不存在
(nil) #hellp以前不存在
127.0.0.1:6379> get hellp  # 新的值
"12435"

INCR:可以对指定key的value执行加1操作,如果指定的key不存在,那么在加1操作之前,会先将key的value设置为0,如果key的value不是数字,则会报错

INCRBY和INCR功能类似,不同的是可以指定增长的步长[INCRBY key increment] increment可正可负

INCRBYFLOAT命令可以用来增长浮点数

127.0.0.1:6379> incr m
(integer) 1
127.0.0.1:6379> incr m
(integer) 2
127.0.0.1:6379> incrby m 66
(integer) 68
127.0.0.1:6379> incrby m 0
(integer) 68
127.0.0.1:6379> incrby m 10 # 递增10
(integer) 78
127.0.0.1:6379> incrby m -50 # 递减50
(integer) 28
127.0.0.1:6379> SET k1 0.5
OK
127.0.0.1:6379> INCRBYFLOAT k1 0.33
"0.83

MGET与MSET

MGET与MSET分别用来批量设置值和批量获取值,如下:

127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> MGET k1 k2 k3
1) "v1"
2) "v2"
3) "v3"

SETEX

SETEX用来给key设置value,同时设置过期时间,等效于先给key设置value,再给key设置过期时间,如下:

127.0.0.1:6379> SETEX k1 30 v1
OK
127.0.0.1:6379> TTL k1
(integer) 26
127.0.0.1:6379> GET k1
"v1"

PSETEX

PSETEX的作用和SETEX类似,不同的是,这里设置过期时间的单位是毫秒,如下:

127.0.0.1:6379> PSETEX k1 60000 v1
OK
127.0.0.1:6379> PTTL k1
(integer) 55412

SETNX

SETNX是 SET if Not eXists的简写,SET命令在执行时,如果key已经存在,则新值会覆盖掉旧值,而对于SETNX命令,如果key已经存在,则不做任何操作,如果key不存在,则效果等同于SET命令。如下:

127.0.0.1:6379> SETNX k1 v1
(integer) 1
127.0.0.1:6379> SETNX k1 vv
(integer) 0
127.0.0.1:6379> GET k1
"v1"

MSETNX

MSETNX兼具了SETNX和MSET的特性,但是MSETNX在执行时,如果有一个key存在,则所有的都不会执行,如下:

127.0.0.1:6379> MSETNX k1 v1 k2 v2
(integer) 0

因为k1已经存在,所以k2也没执行成功。

SETRANGE

SETRANGE用来覆盖一个已经存在的key的value,如下:

127.0.0.1:6379> set k1 helloworld
OK
127.0.0.1:6379> get k1
"helloworld"
127.0.0.1:6379> SETRANGE k1 5 redis
(integer) 10
127.0.0.1:6379> get k1
"helloredis"

但是如果已经存在的key的value长度小于offset,则不足的地方用0补齐,如下:

127.0.0.1:6379> set k1 helloredis
OK
127.0.0.1:6379> SETRANGE k1 20 --java
(integer) 26
127.0.0.1:6379> GET k1
"helloredis\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00--java"

STRLEN

STRLEN用来计算key的value的长度,如下:

127.0.0.1:6379> STRLEN k1
(integer) 26