redis当中默认有16个数据库,分别为db0,db1,db2.......
命令 | 说明 |
---|---|
select N | 选择数据库 |
flushdb | 删除当前数据库中的所有数据 |
flushall | 删除所有数据库中的数据 |
dbsize | 查看数据库中的数据量 |
选择数据库
select 1-15
删除当前数据库重的所有数据
flushdb
删除所有数据库中的数据(谨慎使用)
flushall
查看数据库中的数据量
dbsize
keys键操作
通配符
-
? :匹配一个字符
-
* :匹配任意个(包括0个)字符
-
[] :匹配括号间的任一个字符,可以使用 "-" 符号表示一个范围,如 a[b-d] 可以匹配 "ab","ac","ad"
-
\x :匹配字符x,用于转义符号,如果要匹配 "?" 就需要使用 \?
命令 | 说明 |
---|---|
exists key | 测试指定key是否存在 |
del key1 key2....keyN | 删除指定key |
type key | 返回指定key的value类型 |
keys pattern | 返回指定模式的所有key |
rename oldkey newkey | 改名字 |
dbsize | 返回当前数据路的key数量 |
expire key seconds | 为key指定过期时间 |
ttl key | 返回key的过期剩余秒数 |
select db-index | 选择数据库 |
move key db-index | 把key从当前数据库移动到指定数据库 |
删除key值
del aaa bbb ccc
设置key指定过期时间
expire key seconds
查看key过期时间
ttl key
key的过期时间为-1是永久存在的,但是一旦给值设置了过期时间后,最后都会变成-2,然后永久消失
数据类型
Redis的五大类型主要包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),每种类型都有其独特的功能和使用场景
String类型操作
命令 | 说明 |
---|---|
set key value | 设置key对应值为string类型的value |
setex key seconds value | 设置key对应值为string类型的value,增加到期时间 |
mset key1 value1...keyN valueN | 一次设置多个key的值 |
mget key1 ...keyN | 一次获取多个key的值 |
incr key | 对key的值++操作,并返回新值 |
decr key | 同上,但是做的是--操作 |
incrby key integer | 同incr,加指定值 |
decrby key integer | 同desr,减指定值 |
incrbyfloat key increment | 对key的值增加一个浮点数 |
append key value | 给指定key的字符串追加value |
substr key start end | 返回截取过的key的字符串值 |
getrange key start end | 获取存储在key上的值的一个子字符串 |
setrange key offset value | 将从start偏移量开始的子串设置指定的值 |
设置值
set aaa nihao
取值
get aaa
设多值
mset k1 v1 k2 v2 k3 v3
取多值
mget k1 k2 k3
自增1
incr aaa
自减1
decr aaa
自己设置大小
incrby/decrby aaa 10
设置一个有过期时间的key
setex bbb 5 nihao
list有序集合,链表操作(有序,可重复)
左->右 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
33 | 22 | 11 | 44 | 55 | |
右->左 | -5 | -4 | -3 | -2 | -1 |
命令 | 说明 |
---|---|
lpush key string | 在key对应list的头部添加字符串元素 |
rpop key | 在list的尾部删除元素,并返回删除元素 |
rpush key string | |
lpop key | |
lpush key string | |
llen key | 返回对应list的长度 |
lrange key start end | 返回指定区间内的元素,从下表0开始 |
ltrim key start end | 截取list, 保留指定区间内元素 |
lindex key 下标 | 获取列表下标对应的指定元素 |
blpop key[key...] time out | 删除,并获得该列的第一元素,或阻塞,直到有一个可用 |
brpop key[key...] time out | 删除,并获得该列的最后一个元素,或阻塞,直到有一个可用 |
rpoplpush source destination | 删除列表中的最后一个元素,将其追加到另一个列表 |
brpoplpush source destination timeout | 弹出一个列表的值,将他推到另一个列表,并返回他,直到有一个可用 |
因为list的值是从左开始列的,所以当第二个值过来时,第一个就到右边了,就像反着
创建集合,设置值
lpush list1 1
lpush list1 2
lpush list1 3
取值
0代表第一个,-1代表最后一个,所以可以获取
lrange list1 0 -1
删除集合左边的第一个元素 并返回值这个值
Lpop key
查看key的长度
llen list
查看下标
Lindex list 0
set集合操作(无序,唯一)
命令 | 说明 |
---|---|
sadd key member | 添加一个string元素到key对应的set集合中 |
srem key member | 从key对应set中移除给定元素 |
smove p1 p2 member | 从p1对应set中移除给定元素并添加到p2对应set中 |
scard key | 返回set的元素个数 |
sismember key member | 判断member是否在set中 |
sinter key p1 p2...pN | 返回所有给定key的交集 |
sunion key p1 p2...pN | 返回所有给定key的并集 |
sdiff key p1 p2...pN | 返回所有给定key 的差集 |
smembers key | 返回key对应set的所有元素,结果是无序的 |
sinterstore destination key [key....] | 获取两个集合的交集,并存储在一个关键的结果集 |
sunionstore destination key [key...] | 合并set集合,并将结果存入新的set里面 |
sdifferstore destination key[key...] | 获取队列的差集,并存储在一个新的结果集 |
srandmember key [count] | 从集合中随机获取一个key |
spop key[count] | 删除并取得一个集合里面的元素 |
smove source destination member | 移动集合里的一个key到另一个集合 |
添加
Sadd set nihaoa
返回所有的值
Smembers set
返回个数
scard set
sorted set有序集合操作(有序, 唯一)
分数 | 1 | 2 | 2 | 6 | |
---|---|---|---|---|---|
数据 | 1001 | 1003 | 1004 | 1002 | |
下标 | 0 | 1 | 2 | 3 |
命令 | 说明 |
---|---|
zadd key score member | 添加元素到集合,元素在集集合中存在则更新应对的score |
zrem key member | 删除指定元素 |
zcount key min max | 返回分数范围内的成员变量 |
zincrby key incr member | 按照incr幅度增加对应member的score值,返回score值 |
zrank key member | 返回指定元素在集合中的排名(下标),集合中元素是按score从小到大排序的 |
zrevrank key member | 集合中元素是按score从大到小排序的 |
zrange key start end | 从集合中选择指定区间的元素,返回的是有序集合 |
zrevrange key start end | 同上,返回结果是按score逆序的 |
zcard key | 返回集合中元素的个数 |
zscore key member | 返回给定元素对应的score |
zremrangebyrank key min max | 删除集合中排名在给定区间的元素 |
zinterstore distination numkeys | 相交多个结果集,导致排序的设置存储在一个新的结果集 |
zunionstore destination numberkeys | 添加多个排序集合导致排序的设置存储在一个新的结果集,可以实现取得最大值(max),取得最小值(min) |
设置key
zadd zset 1 1 2 2 3 3 4 4 5 5
从集合中选择指定区间的元素,返回的是有序集合
Zrange zset 0 -1
反向输出
zrevrange zset 0 -1
hash散列操作
命令 | 说明 |
---|---|
hdel key field... | 删除一个或多个hash的field |
hexists key field | 判断field是否存在hash中 |
hget key field | 获取hash中field的值 |
hgetall key | 从hash中读取全部的域和值 |
hincrby key field increment | 将hash中指定域的值增加给定的值 |
hincrbyfloat key field increment | 将hash中指定域的值增加给定的浮点数 |
hkeys key | 获取hash 中所有field |
hlen key | 获取hash中所有字段的数量 |
hmget key field[field...] | 获取hash里面指定字段的值 |
hmset key field[field...] | 设置hash字段值 |
hset key field value | 设置hash里面一个字段的值 |
hsetnx key field value | 设置hash的一个字段,只有这个字段不存在是有效 |
hstrlen key field | 获取hash里面指定field的长度 |
hvals key | 获取hash的所有值 |
hscan key cursor | 迭代hash里面的元素 |
存值
hset hash name cxy
hset hash age 19
hset hash money 200
hmset hash1 name cxy age 19 money 200
取值
hget hash name
hmget hash name age money
长度
Hlen key
事务
Redis事务是指将多条命令加入队列,一次批量执行多条命令,每条命令会按顺序执行,事务执行过程中不会受客户端传入的命令请求影响。
总结说:Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
Redis事务和关系型数据库的事务不太一样,它不保证原子性,也没有隔离级别的概念。
Redis事务没有隔离级别的概念批量操作在发送 EXEC 命令前被放入队列缓存,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。Redis不保证原子性Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。一个事务从开始到执行会经历以下三个阶段:
第一阶段:开始事务第二阶段:命令入队第三阶段、执行事务。Redis事务的相关命令如下:
MULTI:标识一个事务的开启,即开启事务;EXEC:执行事务中的所有命令,即提交;DISCARD:放弃事务;和回滚不一样,Redis事务不支持回滚。WATCH:监视Key改变,用于实现乐观锁。如果监视的Key的值改变,事务最终会执行失败。UNWATCH:放弃监视。
multi
multi:开启事务 exec :结束
当我们开启事务后,输入命令都会返回出一个QUEUED 当我们输入完后,结束输入exec,他就会一个一个将我们输入的命令结果展现出来
运行错误:但是如果有错误的,还是会显示错误,但是对的命令就会执行,错的就不会执行
编译错误:开启事务之后,我们输入命令不是简单的错误而是关键字打错等错误,就会出现这种情况,输入exec开启事务之后的所有命令都不会执行
watch
监听,watch可以监听我们的key,然后展现出key是否会变动
比如我们监听一个苹果,我们的眼睛看到了苹果然后伸出手,最后拿到了苹果咬了一口,这个是没问题的(也就是数据一直在我们的视觉和触觉下,没有一点变动)
比如我们监听一个苹果,我们的眼睛看到了苹果,但是在伸手之前看到旁边的人伸手并且拿到了苹果,别人也碰到过了(也就是数据在拿到我们手里之前,被变动了,所以会返回nil)
redis配置一主双从
一主双从
我们需要准备三个配置文件,也就是复制原来我们安装过的redis的.conf文件,复制三份到某一个文件夹,redis6380.conf、redis6381.conf、redis6382.conf
复制
cp /opt/redis/redisserver/bin/redis.conf /opt/redis/redisserver/bin/rediszc/redis6380.conf
cp /opt/redis/redisserver/bin/redis.conf /opt/redis/redisserver/bin/rediszc/redis6381.conf
cp /opt/redis/redisserver/bin/redis.conf /opt/redis/redisserver/bin/rediszc/redis6382.conf
复制三份后进入配置文件
将三个文件里原来的6379,全改为我们要设置的6380,81,82,密码全部注释掉,允许后台启动
找到密码的位置
在前面加上#注释掉密码
将这个no改为yes,允许后台启动
启动三个redis,启动时后面加上我们的配置类
./redis-server ../rediszc/redis6382.conf
进入redis的两个从进行配置
62和61是一样的操作
切换到6380里,也就是主
查看
可以看到slaves为2,里面有slave0和slave1,
测试,在主机两面增加两个值,看从机会不会也添加