---
Redis 基本命令使用
---
```
使用默认配置文件启动redis服务端
# ./redis-server ../redis.conf
查看redis是否启动
# ps -ef | grep redis
root 13466 1 0 21:19 ? 00:00:00 ./redis-server 0.0.0.0:6379
root 13473 9139 0 21:19 pts/1 00:00:00 grep --color=auto redis
启动redis客户端
# ./redis-cli
使用 auth your password 连接redis
127.0.0.1:6379> auth 123456
OK
如果设置了密码,却没有使用 auth 命令。会报如下错误:
127.0.0.1:6379> get age
(error) NOAUTH Authentication required.
```
## 一、SET命令的相关操作
### 1、set命令的使用
```
以下参与博客链接:
127.0.0.1:6379> set key value [expiration EX seconds|PX milliseconds] [NX|XX]
当key中已经保存一个值的话,这个值会被覆盖成新的值,并且忽略掉原始类型(一个key对应的不一定是一个字符串,也可以是List等其他的数据结构);如果key不存在,那么则会在数据库中新增一个key,对应的值就是刚刚设置的初始值。
127.0.0.1:6379> get age
(nil)
127.0.0.1:6379> set age 14
OK
127.0.0.1:6379> get age
"14"
127.0.0.1:6379> set age 24
OK
127.0.0.1:6379> get age
"24"
set命令--可选的参数。下面依次来介绍:
EX seconds :设置key的过时时间,单位为秒。
PX milliseconds:设置key的过期时间,单位为毫秒。
以ex为例:
127.0.0.1:6379> set age 24 ex 15
OK
127.0.0.1:6379> get age
"24"
15秒过后:
127.0.0.1:6379> get age
(nil)
NX:(if Not eXist)只有键key不存在的时候才会设置key的值
XX:只有键key存在的时候才会设置key的值
127.0.0.1:6379> set name zxk nx
OK
127.0.0.1:6379> get name
"zxk"
127.0.0.1:6379> set name zxk nx
(nil)
```
### 2、setrange 命令的使用
```
127.0.0.1:6379> setrange key offset value
这个命令可以覆盖掉key对应的string的一部分。offset表示需要覆盖的字符串的起始位置,之后会用value的值,覆盖掉原始string的
对应位置的数据。如果原始key不存在,则默认为一个长度为0的字符串。如果offset超过原始string的长度,那么会在之前的string后面
补充0以达到offset。如果value的长度超过了原始string后面可以覆盖的部分,则Redis内部会重新申请内存,完成数据的追加。
127.0.0.1:6379> setrange now 4 "i am a student"
(integer) 18
127.0.0.1:6379> get now
"\x00\x00\x00\x00i am a student"
127.0.0.1:6379> setrange now 0 hihi
(integer) 18
127.0.0.1:6379> get now
"hihii am a student"
```
### 3、mset 命令的使用
```
127.0.0.1:6379> mset key value [key value ...]
mset 一次性设置多个key-value。如果key的值已存在,则会直接覆盖。
相当与同时调用多次SET命令。不过要注意的是,这个操作是原子的。也就是说,所有的keys都一次性设置的。如果你同时运行两个MSET来设置
相同的keys,那么操作的结果也只会是两次MSET中的后一次的结果,而不会是混杂的结果。
127.0.0.1:6379> mset name zxk age 14 job ctbri
OK
127.0.0.1:6379> get name
"zxk"
127.0.0.1:6379> get age
"14"
127.0.0.1:6379> get job
"ctbri"
127.0.0.1:6379> get zxk
(nil)
127.0.0.1:6379> mset name zx age 14 job ctbri
OK
127.0.0.1:6379> get name
"zx"
```
### 4、msetnx **命令的使用**
Set multiple keys to multiple values, only if none of the keys exist
```
127.0.0.1:6379> msetnx key value [key value ...]
原子操作,一次性设置多个key-value。如果存在任何一个key已经存在,那么这个操作都不会执行。所以,当使用MSETNX的时候,要么全部
key都被修改,要么全部都不被修改。
127.0.0.1:6379> msetnx name zx time 2019-05-16
(integer) 0
127.0.0.1:6379> get zx
(nil)
127.0.0.1:6379> get name
"zxk"
127.0.0.1:6379> get time
(nil)
127.0.0.1:6379> msetnx addr beijing time 2019-05-16
(integer) 1
127.0.0.1:6379> get addr
"beijing"
127.0.0.1:6379> get time
"2019-05-16"
```
```
5、SETEX key seconds value
设置key的值和超时。和前面的set key value ex seconds一样。
6、PSETEX key milliseconds value
设置key的值和超时。和前面的set key value px milliseconds一样。
7、SETNX key value
当key不存在的时候,设置key的值。和set key value nx一样。
```
## 二、GET的相关操作
### **1、get 命令的使用**
```
127.0.0.1:6379> get key
根据给定的key,获取value值。如果key不存在,会返回nil。如果key对应的值不是string(List,Set等),则会报错,因为 get 只能处理
string类型的value。
127.0.0.1:6379> get zx
(nil)
127.0.0.1:6379> set question "i am a good boy"
OK
127.0.0.1:6379> get question
"i am a good boy"
127.0.0.1:6379> lpush list 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> get list
(error) WRONGTYPE Operation against a key holding the wrong kind of value
```
### 2、mget命令的使用
```
127.0.0.1:6379> mget key [key ...]
一次性获取多个key的值。如果key不存在,则对应的地方返回nil。
127.0.0.1:6379> mget name age stu
1) "zxk"
2) (nil)
3) "rabbitmqnginx"
```
### 3、**GETRANGE 命令的使用**
```
127.0.0.1:6379> getrange key start end
该指令只要用于获取字符串的字串,在Redis2.0版本之前,叫做SUBSTR。strat和end是字串的起始和结束的位置,可以用负数来表示
距离string尾部的未知的下标。-1是最后一个字符,-2是底数第二个字符。这个表达方式和Python的获取list的子list非常相似。
需要注意的有两点:
字串包括了start和end这两个位置的字符。在Python中是不包含end的。
当给出的start和end超出了string的范围时,指令只会返回在string内的结果。
127.0.0.1:6379> get question
(nil)
127.0.0.1:6379> set question "i am a good boy"
OK
127.0.0.1:6379> get question
"i am a good boy"
127.0.0.1:6379> getrange question 4 9
" a goo"
127.0.0.1:6379> getrange question 4 -1
" a good boy"
127.0.0.1:6379> getrange question 0 9
"i am a goo"
127.0.0.1:6379> getrange question 0 100
"i am a good boy"
```
**4,GETSET 命令的使用**
```
127.0.0.1:6379> getset key value
设置key的值,并返回之前的值。如果之前key的值不是string,则会报错。
这个指令相当于先GET,再SET。
这个指令可以用来配合INCR指令一起使用支持重置的技术功能(INCR我们后面会讲到)。先设置count为0,每次INCR使得count加1。等到需要
获取计数的时候,使用GETSET count 0,就能获取计数的值,并且把计数器重置。
127.0.0.1:6379> set name "strong name"
OK
127.0.0.1:6379> getset name strong
"strong name"
127.0.0.1:6379> get name
"strong"
```
## 三、string的修改操作
### 1、strlen命令的使用
```
127.0.0.1:6379> strlen key
返回key对应的string的长度,如果key对应的不是string,则报错。如果key不存在,则返回0(还是把key对应的看成空字符串)。
127.0.0.1:6379> get name
"strong"
127.0.0.1:6379> strlen name
(integer) 6
```
### 2、append命令的使用
```
127.0.0.1:6379> append key value
如果key已经存在,且值为string,则将value追加到值的后面,如果key不存在,则会创建一个空的字符串的key,然后执行追加操作。
127.0.0.1:6379> set stu redis
OK
127.0.0.1:6379> getset stu rabbitmq
"redis"
127.0.0.1:6379> get stu
"rabbitmq"
127.0.0.1:6379> strlen stu
(integer) 8
127.0.0.1:6379> get redsi
(nil)
127.0.0.1:6379> append stu nginx
(integer) 13
127.0.0.1:6379> get stu
"rabbitmqnginx"
```
### 3、incr 命令的使用
```
127.0.0.1:6379> incr key
对存储在key的整数值进行原子的加1操作。
如果key不存在,则会设置默认值0,再加1。如果key存在,但是存储的值不是字符串,或者存储的字符串不能表示整数,则执行该操
作时,会报错。这个操作仅限于64位的有符号的整型数据。
key存储的值是个字符串,但是该操作的效果和对相应的数字进行操作一样。而且,Redis中,在存储这类字符串的时候,底层上其实存
储的就是一个整数,因此不存在存储上的浪费。
127.0.0.1:6379> decr age
(integer) 14
127.0.0.1:6379> get age
"14"
127.0.0.1:6379> incr name
(error) ERR value is not an integer or out of range
```
### 4、decr,incrby,decrby命令的使用
```
127.0.0.1:6379> DECR key
对存储在key的整数值进行原子的减1操作。
127.0.0.1:6379> INCRBY key increment
对存储在key的整数值进行原子的加操作,加increment。
如果key不存在,操作之前,key就会被置为0。如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支
持64位有符号的整型数字。基本上和INCR一样。
127.0.0.1:6379> DECRBY key decrement
对存储在key的整数值进行原子的减操作,减increment。
127.0.0.1:6379> INCRBYFLOAT key increment
对存储造key中的浮点数进行原子的加操作,加increment。
如果key不存在,操作之前,key就会被置为0。如果key的value类型错误或者是个不能表示成浮点数的字符串,就返回错误。
Redis没有DECRBYFLOAT这个操作,因此想要实现减操作,只需要把increment设成负的就可以。