redis常用操作

第一章-初识redis

1.1 redis简介

redis是一个内存数据库,属于nosql的一种。与myql等关系型数据库不同的方面主要体现在两点上,第一点是存储数据的位置,redis将数据存储在内存中,mysql存储在磁盘中。第二点是存储数据的类型,mysql是关系型数据库,里面的数据大都互相关联,而redis是则不同,redis更多的是当做缓存使用,当某些数据需要经常使用时,就将它放在redis中,如果只是将数据保存,则放在mysql中。

1.2 redis的数据类型与常用命令

redis的数据类型分为5中,具体如下:

数据类型 介绍
string 字符串或者是数字等(类似于java中的String)
list 链表,链表上的每一个节点存储一个string类型的数据(类似于java中的LinkedList)
set 字符串的集合,里面的数据不会相同(类似于java的Set)
hash 包含键值对的无序散列表(类似于java中Map)
zset 字符串的有序集合,元素的顺序按照分值的大小决定

1.2.1 字符串常用操作

命令 行为
set 设置存储string数据
get 获取string数据
del 删除string数据(也可删除其他数据类型)

使用示例:

admindeMacBook-Pro:~ admin$ redis-cli 
127.0.0.1:6379> set name hzq
OK
127.0.0.1:6379> get name
"hzq"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)

示例说明:

name 充当编程语言中的变量名的作用,hzq就是这个变量的值。

1.2.2 list的常用操作

命令 行为
lpush(rpush) 向链表左端(右端)添加数据
lrange 获取在list在给定范围上全部的值
lindex 获取list指定位置的值
lpop(rpop) 从列表左端(右端)弹出一个值,并返回这个值

使用示例:

127.0.0.1:6379> rpush list item1
(integer) 1
127.0.0.1:6379> rpush list item2
(integer) 2
127.0.0.1:6379> rpush list item3
(integer) 3
127.0.0.1:6379> lrange list 0 1
1) "item1"
2) "item2"
127.0.0.1:6379> lrange list 1 2
1) "item2"
2) "item3"
127.0.0.1:6379> lrange list 0 2
1) "item1"
2) "item2"
3) "item3"
127.0.0.1:6379> lindex list 0
"item1"
127.0.0.1:6379> lindex list 1
"item2"
127.0.0.1:6379> lindex list 2
"item3"
127.0.0.1:6379> lpop list
"item1"
127.0.0.1:6379> lindex list 0
"item2"

示例说明:

list需要注意的是它的push与pop命令,首先这两个命令都需要分清左右,另外pop弹出的数据将不再保存在list中

1.2.3 set的常用操作

命令 行为
sadd 将元素添加到set中
smembers 返回set中的所有元素
sismember 检查给定元素是否存在于set中
srem 如果给定元素存在于set中,那就移除它

使用示例:

127.0.0.1:6379> sadd set item1
(integer) 1
127.0.0.1:6379> sadd set item2
(integer) 1
127.0.0.1:6379> sadd set item1
(integer) 0
127.0.0.1:6379> smembers set
1) "item2"
2) "item1"
127.0.0.1:6379> sismember set item1
(integer) 1
127.0.0.1:6379> sismember set item0
(integer) 0
127.0.0.1:6379> srem set item2
(integer) 1
127.0.0.1:6379> smembers set
1) "item1"

示例说明:

我们向set中保存了两个item2,但查询set的全部值却只有一个,这是因为set中不可以保存相同的值,

1.2.4 hash的常用操作

命令 行为
hset 向hash中添加键值对
hget 获取hash中的给定键的值
hgetall 获取hash中的全部键值对
hdel 如果给定的键存在于hash中,就移除它

使用示例:

127.0.0.1:6379> hset hash name1 hzq name2 hhx name3 hxq
(integer) 3
127.0.0.1:6379> hgetall hash
1) "name1"
2) "hzq"
3) "name2"
4) "hhx"
5) "name3"
6) "hxq"
127.0.0.1:6379> hget hash name2
"hhx"
127.0.0.1:6379> hdel hash name2
(integer) 1
127.0.0.1:6379> hget hash name2
(nil)
127.0.0.1:6379> hgetall hash
1) "name1"
2) "hzq"
3) "name3"
4) "hxq"

示例说明:

hset命令向hash中存储键值对时可以同时书写多个,删除hash中的某个键值对使用hdel,删除hash使用命令del

1.2.5 zset的常用操作

命令 行为
zadd 将一个带有指定分值的元素存储到zset中
zrange 返回索引范围内的值
zrangebyscore 返回分值范围内的值
zrem 如果给定元素存在,就移除它

使用示例:

127.0.0.1:6379> zadd zset 100 hzq 85 hxq 12 hhx
(integer) 3
127.0.0.1:6379> zrange zset 0 1
1) "hhx"
2) "hxq"
127.0.0.1:6379> zrangebyscore zset 80 100
1) "hxq"
2) "hzq"
127.0.0.1:6379> zrem zset hhx
(integer) 1
127.0.0.1:6379> zrangebyscore zset 0 100
1) "hxq"
2) "hzq"

示例说明:

zset是按照分值从小到大排序的,即分值小的排在前面,另外zrange命令是按照索引范围查询的,而zrangebyscore是按照分值的范围查询的,只要分值在这个范围内的值都会被返回。另外在zrange与zrangebyscore命令的末尾可以加上关键字withscores,这样返回的元素后面会紧跟着它的分值。

第二章-redis命令

2.1 string

2.1.1 可存储的值的类型

  • 字节串
  • 整数
  • 浮点数

2.1.2 常用操作

对值为数字的string操作:

命令 用例与描述
incr incr keyName-----将键存储的值加一
decr decr keyName-----将键存储的值减一
incrby incrby keyName number-------将键存储的值加上整数number
decrby decrby keyName number------将键存储的值减去整数number
incrbyfloat incrbyfloat keyName number-----将键存储的值加上浮点数number

使用示例:

127.0.0.1:6379> set int 5
OK
127.0.0.1:6379> incr int
(integer) 6
127.0.0.1:6379> decr int
(integer) 5
127.0.0.1:6379> incrby int 50
(integer) 55
127.0.0.1:6379> decrby int 50
(integer) 5
127.0.0.1:6379> incrbyfloat int 10.1
"15.1"
127.0.0.1:6379> incrbyfloat int -10.1
"5"

示例说明:

incr与decr可以认为是加法与减法,在redis中数值类型的数据可以在整数与浮点中自由切换。

对值为字符串或二进制位的命令

命令 用例与说明
append append keyName value----将value追加到keyName存储的值的末尾
getrange getrange keyName start end-----查询字符串中从start到end位的字串(包括start位与end位)
setrange setrange keyName offset value----将keyName存储的值从offset位开始,改为value,被替换的字符数量为value的字符数,当offset超过string原本的长度时,相当于在string的末尾追加内容
getbit gitbit keyName offset----将keyName存储的值看做是二进制位串,返回从offset位的二进制位值
setbit setbit keyName offset value----将keyName存储的值看做二进制位串,然后将从偏移量为offset的二进制位值改为value
bitcount bitcount keyName [start end]----统计二进制位串中值为1的二进制位的数量,strat与end是可选项

使用示例:

127.0.0.1:6379> append name hzq
(integer) 3
127.0.0.1:6379> append name 1
(integer) 4
127.0.0.1:6379> get name
"hzq1"
127.0.0.1:6379> getrange name 0 2
"hzq"
127.0.0.1:6379> setrange name 3 2
(integer) 4
127.0.0.1:6379> get name
"hzq2"
127.0.0.1:6379> setbit char 2 1
(integer) 0
127.0.0.1:6379> setbit char 7 1
(integer) 0
127.0.0.1:6379> get char
"!"
127.0.0.1:6379> bitcount char
(integer) 2

示例说明:

setrange命令重写字符串中的字符数量等于value的字符数量,加入字符串name="abcdefg",我们调用setrange name 0 xy命令,name不等于xy,而是等于xycdefg。

setbit、getbit都只会对一个位进行操作,如果char="!",那么char的二进制表示就是00100001,如果我们对char调用命令getbit char 2命令,就会返回1,如果我们调用setbit char 2 0,也会返回1,因为setbit会返回修改之前的值,此时char的二进制表示是00000001。

2.2 list

list允许用户在list的两段添加或获取数据

2.2.1 常用命令

ps:list允许从左右两段操作,所以以l开头命令都是从左面开始的操作,以r开头的命令都是从右面开头进行的操作,以b开头都是阻塞式操作

命令 用例说明
lpush Lpush key values------>从左端入栈
rpush Rpush key values------>从右端入栈
lpop lpop key------>返回并移除最左面的元素
rpop rpop key------->返回并移除最右面的元素
lindex lindex key offset------->返回从左面开始数第offset+1个元素
ltrim ltrim key start end---->对list裁剪,只保留start到end之间的数据(包含start,end)
lrange lrange key start end----->返回从start到end之间的所有元素(包含start,end)
brpop brpop key timeout------>阻塞返回最右面的元素(当list没有元素时,等待timeout秒)
blpop lrpop key timeout------>阻塞返回最左面的元素(当list没有元素时,等待timeout秒)
rpoplpush rpoplpush key1 key2------->key1从右面弹出一个元素并添加到key2的左面
brpoplpush brpoplpush key1 key2 timeout------->key1从右面弹出一个元素并添加到key2的左面(当key1没有元素时,等待timeout秒)

使用示例:

127.0.0.1:6379> rpush ints 1 2 3 4
(integer) 4
127.0.0.1:6379> lpush ints 0 -1 -2 -3 -4
(integer) 9
127.0.0.1:6379> lrange ints 0 9
1) "-4"
2) "-3"
3) "-2"
4) "-1"
5) "0"
6) "1"
7) "2"
8) "3"
9) "4"
127.0.0.1:6379> lpop ints
"-4"
127.0.0.1:6379> lrange ints 0 9
1) "-3"
2) "-2"
3) "-1"
4) "0"
5) "1"
6) "2"
7) "3"
8) "4"
127.0.0.1:6379> lindex ints 0
"-3"
127.0.0.1:6379> rpoplpush ints ints2
"4"
127.0.0.1:6379> lindex ints2 0
"4"

示例说明:list的操作需要注意方向,pop命令执行后会移除这个元素,如果只是查看某个元素应该使用lindex命令

2.3 set

set存储元素是无序并且不可重复的

2.3.1常用命令

对一个set操作

命令 用例说明
sadd Sadd key values----->添加一个或多个元素
srem srem key values------>移除一个或多个元素
sismember sismember key value------>检查value是否存在于key中
scard scard key------->返回set中的元素数量
smembers smembers key------>返回set中的全部元素
Srandmember srandmember key [count]---->随机返回count的绝对值个元素,当count为正数,返回元素不重复,为负数,返回元素会重复
Spop spop key [count]------>随机移除count个元素
Smove smove key1 key2 value------>移除key1中的元素value,并将该元素添加到key2中

使用示例:

127.0.0.1:6379> sadd set1 hzq zs wsb lqy lxp xk
(integer) 6
127.0.0.1:6379> srem set1 hzq
(integer) 1
127.0.0.1:6379> smembers set1
1) "lqy"
2) "zs"
3) "lxp"
4) "wsb"
5) "xk"
127.0.0.1:6379> sismember set1 hzq
(integer) 0
127.0.0.1:6379> sismember set1 xk
(integer) 1
127.0.0.1:6379> scard set1
(integer) 5
127.0.0.1:6379> scard set1
(integer) 5
127.0.0.1:6379> sadd set1 hzq
(integer) 1
127.0.0.1:6379> scard set1
(integer) 6
127.0.0.1:6379> srandmember set1 3
1) "hzq"
2) "zs"
3) "wsb"
127.0.0.1:6379> srandmember set1 3
1) "hzq"
2) "lxp"
3) "lqy"
127.0.0.1:6379> srandmember set1 -3
1) "wsb"
2) "xk"
3) "zs"
127.0.0.1:6379> srandmember set1 -3
1) "hzq"
2) "hzq"
3) "xk"
127.0.0.1:6379> spop set1 1
1) "lxp"
127.0.0.1:6379> smembers set1
1) "hzq"
2) "zs"
3) "lqy"
4) "wsb"
5) "xk"
127.0.0.1:6379> smove set1 set2 hzq
(integer) 1
127.0.0.1:6379> smembers set1
1) "zs"
2) "lqy"
3) "wsb"
4) "xk"
127.0.0.1:6379> smembers set2
1) "hzq"

对多个set进行操作

命令 用例说明
sdiff sdiff key1 key2 key3....------>返回key1与其他集合的差集(只存在于key1,不存在于其他集合的元素)
sdiffstore sdiffstore key0 key1 key2 key3....------>同上,只不过会将差集保存在key0中
sinter sinter key1 key2 key3....-------->返回所有集合的交集(同时存在于所有集合中的元素)
sinterstore Sinterstore key0 key1 key2 key3.....------->同上,只不过会将交集保存在key0中
sunion sunion key1 key2 key3....-------->返回所有集合的并集(至少存在于一个集合的元素)
sunionstore sunionstore key0 key1 key2 key3.....------>同上,只不过会将并集保存到key0中

2.4 hash

相当于java中的map集合,内部形式是key:value.

2.4.1常用命令

命令 用例说明
hset Hset hash_name key1 value1 key2 value2......------>向hash_name中保存相对应的key:value数据
Hmget Hmget hash_name key1 key2 key3.....------>获取hash_name中key1 key2 key3等的值
hdel hdel hash_name key1 key2.....------>一尺hash_name中一个或多个键值对
Hlen hlen hash_name------->返回hash_name中键值对的个数
hexitst Hexists hash_name key----->检查hash_name中是否存在key的键
hkeys hkeys hash_name------>返回hash_name中全部的key
hvals hvals hash_name------>返回hash_name中全部的value
hgetall hgetall hash_name------>返回hash_name中全部的键值对
hincrby Hincrby hash_name key number------>将hash_name中的key对应的value加上number
hincrbyfloat 同上,只是加上一个浮点数

2.5 zset

和set的区别是zset是有序的,他的zset的每一个元素都有一个对应的分数,zset会将元素按照分数进行排序

2.5.1 常用命令

命令 用例说明
zadd zadd key score1 member1 score2 member2....------>向key中添加一个或多个元素,每个元素都有一个分数
zrem zrem key menber1 member2.....----->移除一个或多个元素
zscore zscore key member--------->返回这个元素的分数
Zcard zcard key----->返回这个zset中元素的个数
zincyby zincrby key number member------>将元素member的分数加上number
zcount zcount key min max------->返回分数介于min与max之间的元素个数(包含分数等于min或max的元素)
zrange zrange key start end [withscores]----->按照分数从小到大的顺序,返回偏移量为start到end的元素(加上withscores会显示每个元素的分数)
Zrank zrank key member------>按照分数从小到大的排序,返回member在zset中的偏移值

ps:除了这些命令还有其他命令,但并不常用.

2.6 其他命令

2.6.1 键的过期时间

命令 用例说明
persist persist key----->移除键的过期时间
ttl ttl key------>查看键的过期时间(单位为秒)
expire expire key seconds----->设置键的过期时间为seconds秒之后

第三章-数据安全与性能保障

3.1数据持久化存储

3.1.1 快照存储

快照存储是将内存中的数据保存在磁盘上,默认的文件名是dump.rdb

配置文件

save <seconds> <changes>
示例:
save 900 1
上面的配置代表900秒之内如果至少有一个键发生了改变,就会创建快照,该配置项可以配置多次,如下:
save 900 1
save 300 10
save 60 10000
当上面的3个配置项有一个满足条件,那么就会创建快照,所有条件的都会重新开始计算
可以注释全部save 配置来关闭自动的快照存储

命令形式

  1. 向redis发送bgsave或者save命令,在redis占用内存少的情况下推荐使用bgsave,两者的区别:

​ save会阻塞进程,在快照创建过程中不受理客户端的任何请求,bgsave则是新建一个进程来进行快照的创建,过程中不影响redis的使用

save命令创建快照的速度比bgsave快数倍

  1. 向redis发送shutdown命令

ps:快照存储在遇到崩溃事件,会丢失最近一次创建快照之后的所有数据.

3.1.2 AOF持久化

AOF持久化是将redis接收执行的更新操作保存在一个文件中,执行的每一条更新操作,都会在这个文件末尾追加该指令.

配置文件

开启AOF持久化,no是关闭
appendonly yes
AOF持久化存储的文件
appendfilename "appendonly.aof"
appendsync 的3个选项
always 代表每执行一句更新操作都会进行同步,会极大的降低性能,而且还会严重损害固态硬盘
# appendfsync always
everysec 代表每一秒同步一次,性能下降非常小
appendfsync everysec
no 代表有操作系统来决定同步时间,无法预期.
# appendfsync no
下面的两个配置是用来配置AOF文件的重写条件,只有当同时满足下面两个条件时,才会会重写AOF文件,下面的配置代表:
当AOF文件大小超过64mb,并且当前AOF文件的大小比上一次重写之后的增大了至少一倍时存在会进行重写AOF文件
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

3.2 主从复制

一个redis服务器作为master,后面连接一个或多个redis服务器作为slave,当执行更新操作时会由master执行,然后slave与master进行数据同步,当执行查询操作时有slave执行.

3.2.1 主从复制的操作

master服务器的配置不需要任何变动

slave连接master的方式:

  1. 配置文件
# master服务器的密码
masterauth 960828
# master服务器
slaveof localhost 6379
  1. 在已启动的redis服务器上执行
slaveof master_host master_port

slave断开连接的方式:发送下面命令

slaveof no one

ps:主从复制可以使用多个slave服务器连接一个master,也可以一个master后面跟一到多个slave,而这一到多个slave后面也可以跟着一到多个slave形成一条主从复制链

第四章-redis事务

  1. multi: 标记一个事务块的开始
  2. exec: 执行所有事务块的命令
  3. discard: 取消事务,放弃执行事务块内的所有命令
  4. watch: 监视一个或者多个key,如果在事务执行前(多个key的任意一个)key被其他命令所改动,那么事务将被打断
  5. unwatch: 取消对所有key的监视

正常的redis事务的使用是:

  1. 使用watch命令监视我们需要保证同步的key
  2. 使用multi命令开启事务
  3. 执行我们的操作
  4. 使用exec执行事务

4.1 redis事务的注意事项

  1. redis的事务仅仅只是将多个操作一起发送到redis服务器,然后redis服务器开始执行这条事务时阻塞其他的命令来完成事务
  2. redis事务中的多条命令在执行过程中仅仅只是按照顺序去执行而已,如果在事务执行过程中的某一条命令执行失败,并不会影响到其他的命令,即无法保证事务的原子性
  3. exec命令会取消watch命令的监视
  4. watch命令可以实现乐观锁(或者说watch就是乐观锁)
posted @ 2021-06-01 18:34  夜雨夕眠  阅读(157)  评论(0)    收藏  举报