redis常用命令、数据类型、redis.conf配置文件、备份策略讲解

前言

环境:centos7 redis-6.2.6.tar.gz(https://redis.io/download)

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value的,内存高速缓存数据库,并提供多种语言的API。redis是一种nosql(not only sql)数据库,其存储的是key-value型数据。

启动redis服务,并使用redis.cli客户端工具连接登陆

1、启动redis服务
cd /usr/local/redis-6.2.6/bin/
#指定配置文件,启动redis-server
./redis-server  /usr/local/redis-6.2.6/etc/redis.conf
2、命令行redis-cli客户端登陆
#用redis-cli命令行客户端工具连接,指定IP端口
cd /usr/local/redis-6.2.6/bin/
./redis.cli -h 192.168.1.0 -p 6379       					
192.168.1.0:6379> auth aabbcc001		#使用auth命令来输入密码登陆									
OK
192.168.1.0:6379>quit					#退出客户端或exit									

基础讲解

1、redis默认有16个数据库,DB index从0开始,即0-15,默认登陆第一个index为0的数据库,默认数据库个数可通过redis.conf配置文件databases 
参数修改;
2、redis的命令不区分大小写,但数据有大小写之分,如: I 和i是不同的数据;
3、redis的密码都是统一的,即全部库都是统一的登陆密码,密码在redis.conf配置文件中requirepass参数配置;
4、redis默认端口6379,可在配置文件中修改默认端口。

redis常用命令讲解

redis常用命令官方文档:https://www.redis.net.cn/order/
命令都有补全功能,按tab键就能自动补全。

help command: 查看命令的帮助文档,如 help select 
select index: 切换数据库,如select 1,即切换到库1,数据库索引从0开始,redis.conf里默认配置了16个数据库,可以自行修改
exists key_name :测试key是否存在,如exists age;
dbseize: 查看当前数据库中的key总数量;
flushdb:清空当前库中的所有key(危险慎用);
flushall:清空所有库中的所有key(危险慎用);
save  :执行备份

redis的数据备份

默认redis.conf配置文件里开启了rdb备份,备份文件名为dump.rdb
如果是做redis迁移,其实就是先备份dump.rdb,然后将dump.rdb拷贝到新的redis实例中启动。

#登陆redis
./redis-cli -h 192.168.1.0 -p 6379
192.168.1.0:6379> auth aabbcc001			#使用auth命令来输入密码登陆
OK
192.168.1.0:6379>save						#做一次手动备份,让还未来及的备份的数据备份到dump.rdb中
						#我们知道在redis.conf配置文件中可以配置redis的自动备份机制,默认值是:
						#	save 900 1 	表示900秒(15分钟)内至少有1个数据更改就同步到数据备份文件
						# 	save 300 10 	表示300秒(5分钟)内至少有10个数据更改就同步到数据备份文件
						#	save 60 1000	表示60秒(1分钟)内至少有1000个数据更改就同步到数据备份文件
						# 所以直接在命令行可以执行save命令手动备份,让未来得及的自动备份的数据进行马上备份

192.168.1.0:6379>shutdown save				#关机并保存(redis服务端进程就会被关掉了)

#这样,再重新启动redis时,redis就能从dump.rdb重新加载恢复数据了
# 如果是redis做数据迁移,道理也是一样,先停掉旧的redis,备份dump.rdb文件;
# 安装好新的redis,拷贝dump.rdb到新的redis服务器指定目录,新的redis的配置文件里面配置好dump.rdb的文件路径,然后启动新的redis实例即可。

redis支持的数据类型:string类型、list类型、hash类型、set数据类型、zset数据类型,每种数据类型的命令语法都有所不同。
redis支持的数据类型:字符串(String), 哈希(hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)

string字符串

set命令:用于给key设置string类型数据,语法格式如下:

set key value [EX seconds | PX milliseconds] [NX|XX] [KEEPTTL]

192.168.1.0:6379>> set age 20				#插入一个名为age的键,注意其值为字符类型值20
OK
192.168.1.0:6379>>  get age					# get命令获取key的值,可见age的值是字符串20
"20"
192.168.1.0:6379>> 
命令作用示例
set key value添加一个key并赋值,其值是string类型set age 20
mset key value [key value …]添加多个键值,其值是string类型mset name “LiMing” sex ‘man’
setrange key index value修改指定key的值,从index处开始替换成为value(注:index从0开始)setrange name 5 “HAUNG SHANG”
get key查看指定key对应的value值get age
mget key1 key2 […]批量获取指定key的value(get key 只能获取指定的单个key的值)mget name sex
getrange key start end获取指定key的value的指定index区间的值set k1 “I am k1”,getrange k1 0 3 返回值为:I am
getset key new_value设置指定key的新值,输出返回结果是旧值getset sex “WOmu”
del key [key …]删除key,可以同时删除多个keydel age1 age2
append key value对指定的key的value追加字符串append passwd “123456”
strlen key查看指定key的长度strlen passwd
substr key arg arg从指定位置进行截取key的value值中的字符串(只截取显示不对value产生任何修改)substr passwd 0 8
type key查看指定key的value值的数据类型type age,返回string类型
keys pattern查找所有符合给定模式( pattern)的 key ,pattern是匹配符,可以使用*号进行模块匹配查询keys “a*”
exists key […]检测指定key是否存在。返回1表示存在,0表示不存在,当有多个参数时,只要其中一个存在就返回1exists age
move key db移动某个key到指定库move age 15
randomkey从当前库随机返回一个key,返回的仅是键名randomkey
rename key newkey重命名一个keyrename age age8
expire key seconds设置key的过期时间(计算基数为:秒),过期后key将被删除,keys age已经查看不到了,这是redis根据过期数据的策略进行处理的expire age 10
pexpire key milliseconds指定某个key的过期时间(计算基数为:毫秒),过期后key将被删除,keys age已经查看不到了,这是redis根据过期数据的策略进行处理的pexpire age 100
ttl key查看指定key剩余过期时间,返回值为3类:数字表述剩余过期时间;-1表示永不过期;-2表示已过期ttl age
incr key指定的key的value值递增加1(values要为整数才能加)incr age 加1
decr key指定的key的value值递减减1(values要为整数才能减)decr age 减1
incrby key increment指定的key的value值递增加1且指定步长incrementincrby age 10 加10
decrby key increment:指定的key的value值递减减1且指定步长incrementdecrby age 12 减12

list列表

命令作用示例
lpush key element[element…]将一个或多个值 value 插入到列表 key 的表头(最左边)如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。
rpush key element[element…]将一个或多个值 value 插入到列表 key 的表尾(最右边)如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c
lrange key start stop取出集合的数据,0 -1 表示取出全部数据,如 lrange key 0 -1lrange mylist 0 -1
lpop key移除列表 key 的头元素,即第一个元素,同时返回显示头元素lpop mylist
rpop key移除列表 key 的尾元素,即最后一个元素,同时返回显示尾元素rpop mylist
lrem key conut valuecount 的值可以是以下几种:count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count;count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值;count = 0 : 移除表中所有与 value 相等的值lrem mylist 0 "Good"全部删除、lrem mylist 1 "Good"从表头开始搜索删除1个、lrem mylist -2 "Good"从表尾往前搜索删除2个
llen key返回列表 key 的长度llen mylist 返回4,表示mylist长度是4,有4个元素
lindxe key index返回列表 key 中,下标为 index 的元素LINDEX mylist 2 ,返回第3个元素值
lset key index value设置集合指定索引的值(索引不能超过集合最大索引)lset mylist 0 “Good”
linsert key before after element new_value从集合头向后查找匹配的第一个element元素,从其前或其后插入新元素new_value。当无匹配元素时不执行任何操作linsert mylist before “laoliu” “I am laoliu”,表示从前往后搜索"laoliu",找到后在其前面插入 “I am laoliu”
ltrim key start stop对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除ltrim mylist 0 4

hash哈希(很常用的数据结构)

hash哈希数据类型用于存这样的数据,key field value[field value…], 如:李明 性别:男 年龄:28 地址:深圳市 学校:深圳一中 电话:0755-7788

命令作用示例
hset key field value[field value…]设置哈希表key中的域field的值设为value,若果key不存在,将创建新的hash表并新建域插入值,如果域field已存在旧值就被新值覆盖。hset key13 id 001 name liming age 12。注意:低版本的redis中此hset命令可能只能设置单个fieldhset “liming” sex “man” age 28 addr “guanddong_shenzhen” shcool “szluohuizhong”
hsetnx key fiels value哈希表中添加field和值,添加成功返回1,若已存在该field则不添加,返回0hsetnx “liming” “top” “168cm”
hmset key field value[field value…]同时设置哈希表多个field和值,高版本的redis此命令与hset相同hmset “liming” sex “man” age 28 addr “guanddong_shenzhen” shcool “szluohuizhong”
hget key field获取哈希表中单个指定域的值hget “liming” age
hmget key field [field …]获取哈希key指定域的值,与hget的区别在于hmget可获取多个域的值hmget “liming” sex age addr
hgetall key获取哈希key全部的域和其值hgetall “liming”
hexists key field判断哈希表中指定域field是否存在,存在则返回1,不存在返回0hexists “liming” age
hkeys key显示指定哈希表的全部filedhkeys “liming”
hvals key显示指定哈希表的全部valueshvals “liming”
hlen key显示哈希表的长度,其长度为field的个数hlen “liming”
HDEL key field [field …]删除哈希表中指定的域hdel “liming” “age” “sex”
hincrby key field increment指定域中递增,递增增量为increment,如hincrby k13 age 20,则年龄加12岁hincrby “liming” age 20

set 集合

命令作用示例
sadd key member [member…]设置指定key的值,member重复时至保留一个。即set数据无须且数据不重复sadd name-set “libai” “xiaohei” “xiaohong”
smembers key获取指定的集合key的全部membersmembers name-set
sinter key [key …]返回两个或多个集合的交际,即共同元素sinter name-set name-set2
sunion key [key …]返回两个或多个集合的并集,去掉重复元素sunion name-set name-set2
sdiff key [key …]返回key1在key2中没有的差集sdiff name-set name-set2
srem key member删除指定集合key的某个membersrem name-set “xiaoxiao”
smove source destination member将 member 元素从 source 集合移动到 destination 集合smove name-set name-set2 “xiaohei”
sismember key menber判断集合key的某个member是否存在,存在则返回1,不存在返回0sismember name-set “xiaoxiao”
spop key [count]从集合key集合中随机移除count个元素spop name-set2 1
scard key统计集合key的元素个数scard name-set

zset 有序集合

zset数据类型中的每个元素都会关联一个 数值类型的权重参数(score),这使得集合中的元素能够按score进行有序排列。

命令作用示例
zadd key score member [score member …]将一个或多个 member 元素及其 score 值加入到有序集 key 当中,如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。score 值可以是整数值或双精度浮点数zadd hotTop 1 xiaomi 3 huowei 4 pingguo 2 chuizhi
zrange key min max返回有序集合key的member 元素,,按score从小到大排序zrange hopTop 0 -1
zrevrange key min max返回有序集合key的member 元素,,按score从大到小排序
zscore key member返回有序集 key 中 member 的 score 值zscore hotTop xiaomi
zincrby key increment member加数值,实现sore值增大或减小从而实现member 排序上升或下降zincrby hotTop 9 “Good”,good的sore增加了9,zincrby hotTop -21 Good,good的sore减少了21
zcard keys返回有序集合中member的个数zcard hotTop
zrem key member [member …]删除有序集合中的指定成员memberzrem hotTop “Good”

redis.conf配置大全详解

daemonize no/yes				#是否开启redis为守护进程(即后台运行),默认为no,使用二进制部署的而地上修改为yes后台运行redis进程是最好的,但要注意使用docker容器启动redis,该值必须设置为yes前台启动,因为容器需要一个进程夯住前端
pidfile /var/run/redis.pid		#进程的pid文件		
port 6379						#redis的监听端口,默认为6379
bind 127.0.0.1		#redis监听绑定本机哪个ip地址,默认是127.0.0.1,应该设置为对外ip地址(0.0.0.0表示绑定本机全部网络IP)
timeout 0			#设置超时时间,当客户端闲置多长时间后关闭连接.0表示不启用此功能
logleverl notice	#设置日志级别,redis总共支持四个级别:debug verbose notice warning,默认notice
debug: 很多信息,便于开发测试;
verbose: 许多有用的信息,但没有debug基本的信息多;
notice: 适当的信息,合适生产环境使用;
warning: 只有非常重要的信息

#日志文件,默认为标准输出,如果redis为守护进程方式运行,而又没有给出具体的日志文件,则Redis默认为标准输出,则日志将会被发送给/dev/null
logfile /usr/log/reids/logs/redis.log

database 16			#设置数据库的数量,默认16个,客户端连接默认进入数据库0,可用select index来切换数据库

save <seconds> <changes>	#指定在多长时间内,有多少次更新操作就将数据同步到数据备份文件
redis配置默认提供:
save 900 1 		表示900秒(15分钟)内至少有1个数据更改就同步到数据备份文件
save 300 10 	表示300秒(5分钟)内至少有10个数据更改就同步到数据备份文件
save 60 1000	表示60秒(1分钟)内至少有1000个数据更改就同步到数据备份文件

save ""							# 当不需要使用rdb备份redis数据时,直接写空字符串即可关闭rdb备份
#指定数据存储到数据库rdb文件是否压缩数据,默认yes,redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但这会导致数据库文件变得非常的大
rdbcompression yes

dbfilename dump.rdb				#指定数据备份文件名(redis的数据库文件后缀默认为.rdb),文件位于$dir目录下
dir /usr/logcal/redis/data/		#指定数据备份文件的存放位置,默认为当前配置文件的目录下,注意是目录不是文件

appendonly no					# aof备份策略,默认是不开启的,该为yes则开启
appendfilename "appendonly.aof"	# 备份的文件名
# aof是文件追加的方式记录redis的写入操作,下面3种方式表示数据何时落盘,fsync是同步落盘的意思
# appendfsync always			# always: 每次redis写入数据都进行fsync.慢,安全.
appendfsync everysec			# everysec: 每秒进行一次fsync,折中方案.默认值,如果你不确定要使用哪种方式,使用everysec即可
# appendfsync no				# no: 不进行fsync,让操作系统决定在需要时同步数据落盘,快.


#设置redis连接密码,如果配置了该连接密码,客户端在连接redis时需要使用auth <password>命令提供密码进行认证通过才能连接成功
requirepass manager001

#设置同一时间最大的客户端连接数,默认10000,若不启用该参数,则默认客户端最大连接数为Redis进程可以打开的最大文件描述符数。当达到最大连接数后Redis会关闭新的连接并向客户端发送“max number of clients reached”错误信息。
maxclients 10000

syslog-enabled no		#是否开启syslog功能,默认就是no,保持默认即可
syslog-ident redis		#syslog的标识符

#设置Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会尝试清除已到期或即将到期的key
#采用以下策略能达到最大内存后Redis不能进行写操作,但可以进行读操作.
maxmemory <bytes>

#当达到最大内存限制后,新版的Redis提供5中策略来处理
volatile-lur 利用LRU算法移除设置过期时间的key
allkeys-lur 利用LRU算法移除任何key
volatile-lfu 
allkeys-lfu
volatile-random 移除过期时间的随机key
allkeys-random 移除过期的全部key
volatile-ttl 移除即将过期的key
noeviction	不移除任何key,只是返回一个写错误(默认选项)





#客户端查看某个配置命令
config get <port>
#客户端查看所有配置命令
config get *

redis的客户端使用命令行的方式连接的话一般不太可视化,还有更可视化的客户端工具,如:redis-desktop-manager.exe、redisplus.exe(需要更改redis.server中的config文件中的bind参数和protected-mode no才能让第三方客户端工具连接的上)

java中连接redis:
 Jedis jedis=new Jedis("192.168.1.100",6379);
jedis.auth("manager001");
system.out.print(jredis.ping())      //输出PONG
jedis.close();
Java中操作Redis一般都有对于Redis命令的方法,如:
jedis.add方法、jedis.zadd方法、jedis.set方法、jedis.mset方法、jedis.select(0);

rdb 和aof两种备份策略比较

使用rdb,默认的备份策略是:

# 不同的redis版本其默认值可能不同
#   * After 3600 seconds (an hour) if at least 1 key changed
#   * After 300 seconds (5 minutes) if at least 100 keys changed
#   * After 60 seconds if at least 10000 keys changed
#
# You can set these explicitly by uncommenting the three following lines.
#
save 3600 1		# 3600m秒即1小时至少有1个数据更改就同步到rdb备份文件
save 300 100	# 300秒即5分钟至少有100个数据更改就同步到rdb备份文件
save 60 10000	# 60秒即1分钟至少有10000个数据更改就同步到rdb备份文件

可以看的出,rdb这样备份策略其实备份频率较为宽松,比如 1分钟内写了500个key,按照上面的策略,在1-4分钟之间这500个key并不会备份,如果这时候redis宕机,那么这500个key就会丢失。当然,也可以调整save 的备份频率,但官网提供了更为频繁的备份方式-aof备份策略。

aof(append only file),aof持久化以日志的形式记录redis每个写操作(读操作不记录)的命令,并追加到aof文件的末尾,这样redis重启时会根据记录文件从头到尾全部执行一遍命令以完成数据的恢复工作,这种备份方式主要解决数据持久化的实时性问题。

appendonly no						# 默认是不开启的,该为yes则开启
appendfilename "appendonly.aof"		# 备份的文件名

# fsync()调用告诉操作系统实际写入磁盘上的数据
# 而不是在输出缓冲区中等待更多的数据。有些操作系统真的会刷新
# 数据在磁盘上,一些其他的操作系统会尝试尽快做它。
#
# Redis支持3种不同的fsync模式:
#
# no: 不进行fsync,让操作系统决定在需要时同步数据落盘,快.
# always: 每次redis写入数据都进行fsync.慢,安全.
# everysec: 每秒进行一次fsync,折中方案.

# 默认值为"everysec",因为这通常是速度和数据安全性之间的折中方案。您需要了解是否可以将此设置放宽为"no",
# 这将让操作系统在需要时刷新输出缓冲区,以获得更好的性能(但是如果您可以接受数据丢失的想法,可以考虑使
# 用默认的持久性模式,即快照),或者相反,使用"always",这比everysec要慢得多,但比它更安全一些。


# appendfsync always
appendfsync everysec	# 默认值,如果你不确定要使用哪种方式,使用everysec即可
# appendfsync no

redis是否需要备份

在需要高性能的redis集群场景下,频繁的aof备份,数据写入磁盘会导致损耗redis性能,所以需不需要redis备份数据就得看自己的需求了。
对于允许key丢失不需要实时备份key的场景下,可以使用rdb的备份方式,如果根本不需要备份,只需要redis高性能,可以关闭备份:
# 关闭rdb备份:
save ""
# 关闭aof备份:
appendonly no

只使用一种备份策略

开启了aof备份,rdb备份就失效了,也就是说不要同时开启两种备份策略,只要开启一种即可。

1、只开启rdb:使用rdb文件进行备份恢复数据;
2、只开aof:使用aof文件进行备份恢复数据;
3、同时开启aof和rdb:第一次设置aof并启动redis,rdb又没关,此时rdb文件内容会被情况,redis会使用aof文件来备份(加载恢复),此时redis
执行写入key操作,操作将被同时记录到aof文件和rdb文件,也就是说此时aof文件和rdb文件记录的数据内容是一样的。所以,如果是先开了rdb,后面
想要切换aof,如果要需要可以先将rdb文件复制备份一份数据,以免被覆盖掉。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值