Redis基础知识与入门

一、安装
1.检查是否有gcc-c++环境
ps -ef | grep gcc-c++
如果没有,则需要安装:yum install –y gcc-c++
2.开始安装redis
a)编译
在redis解压后根目录里面的src目录下执行make命令
b)安装
编译完成之后,执行make install命令,文件会被安装到/usr/local/bin

二、启动
将配置文件redis.conf拷贝一份到某个目录,例如/root/myredis目录下(可以是任意可执行目录),然后进入到/root/myredis目录下,
启动服务:redis-server redis.conf,这样启动服务会一直占用着窗口,可以修改配置文件redis.conf里面的daemonize属性,改为yes(daemonize yes),此进行就变成了守护进程,就会在后台运行

三、连接
1.如果没有修改Ip或者端口,只需要redis-cli命令即可连接
2.如果修改了ip或者端口,则需要 redis-cli -h ip -p 端口,例如:redis-cli -h 192.168.1.3 -p 6379,如果设置了密码,第一次连接后,还需要输入:
auth 密码,例如auth 123456
3.退出
服务端退出,需要客户端输入:shutdown命令
客户端退出,在客户端输入:exit或quit

四、数据库操作
1.select num:切换到指定数据库,如select 0
2.flushdb :清空当前库
3.dbsize :查看当前数据库个数
4.flushall:通杀全部库
5.keys pattern:查找指定key,例如keys*,查找所有key
6.type key:查看key对应类型
7.exists key:查看指定key是否存在
8.del key:删除key
9.randomkey:在现有的KEY中随机返回一个key
10.expire key seconds:设置过期时间(秒),过期后key会被删除,例如 expire k1 60(表示将k1设置60秒)
11.ttl key:查看key还有多少秒过期,-1表示永不过期,-2表示已过期(不存在)
12.rename key newkey:重命名key,如果mewkey已存在,则会覆盖
13.renamenx ky newkey:重命名key,如果mewkey已存在,则会报错

五、redis常用五大数据类型
string,list,set,hash,zset
1.string
set key value:添加键值对
get key:查询指定key
append key value:将给定的value追加到原值的末尾
strlen key:获取值的长度
setnx key value:只有在key不存在时设置 key 的值,否则报错
incr key:指定key的值自增1,只对value为数字有效
decr key:指定key的值自减1,只对value为数字有效
incrby key num:指定key的值增加num,只对value为数字有效
DECRBY key num:指定key的值减少num,只对value为数字有效
mset k1 v1 k2 v2…:同时设置多个key-value对
mget k1 k2 …:同时获取一个或多个value
msetnx k1 v1 k2 v2…:当key不存在时,同时设置多个key-value对
getrange key 起始索引 结束索引:获取指定范围的值,都是闭区间
setrange key 起始索引 value:从起始位置开始覆写指定的值
getset key value:以新换旧,同时获取旧值
setex key 过期时间 value:设置键值的同时,设置过期时间,单位秒

2.list(双向链表)
lupsh/rpush key value1 value2…:从左边/右边压入一个或多个值,头尾效率高,中间效率低
lpop/rpop:从左边/右边弹出一个值,值在键在,值光键亡,弹出=返回+删除
lange key start stop:查看指定区间的元素(对应任意长度的list,长度必定为[0,-1]),正着数:0,1,2,3,…,倒着数:-1,-2,-3,…
lindex key index:按照索引下标获取元素(从左到右)
llen key:获取列表长度
linsert key bbefore|after value newvalue:在指定value的前后插入newvalue
lrem key n value:从左边删除n个value
lset key index value:把指定索引位置的元素替换为另一个值
ltrim key start stop:仅保留指定区间的数据
rpoplpush key1 key2:从key1右边弹出一个值,左侧压入到key2
3.set(无序的,不可重复的)
sadd key member [member …]:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
smembers key:取出该集合的所有值
sismember key value 判断集合是否为含有该值,有返回1,没有返回0
scard key 返回集合中元素的数量
srem key member [member …] 从集合中删除元素
spop key [count] 从集合中随机弹出count个数量的元素,count不指定就弹出1个
srandmember key [count] 从集合中随机返回count个数量的元素,count不指定就返回1个
sinter key [key …] 将指定的集合进行“交集”操作
sinterstore dest key [key …] 取交集,另存为一个set
sunion key [key …] 将指定的集合执行“并集”操作
sunionstore dest key [key …] 取并集,另存为set
sdiff key [key …] 将指定的集合执行“差集”操作
sdiffstore dest key [key …] 取差集,另存为set
4. hash
HSET key field value 为key中的field赋值value
HMSET key field value [field value …] 为指定key批量设置field-value
HSETNX key field value 当指定key的field不存在时,设置其value
HGETALL key 获取指定key的所有信息(field和value)
HKEYS key 获取指定key的所有field
HVALS key 获取指定key的所有value
HLEN key 指定key的field个数
HGET key field 从key中根据field取出value
HMGET key field [field …] 为指定key获取多个filed的值
HEXISTS key field 指定key是否有field
HINCRBY key field increment 为指定key的field加上增量increment

5.zset
zset是一种特殊的set(sorted set),在保存value的时候,为每个value多保存了一个score信息。根据score信息,可以进行排序。
这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了
zadd key score1 member1 score2 member2…:添加,例如zadd z1 50 aa 60 bb 70 cc 80 dd 90 ee 100 ff 110 gg 120 hh
zscore key member:返回指定值的分数
zrange key start stop [withscores]:返回指定区间的值,可选择是否一起返回scores
zrangebyscore key min max [WITHSCORES] [LIMIT offset(返回结果起始位置) count(返回结果数量)]:在分数的指定区间内返回数据,从小到大排列
zrevrangebydcore key max min [WITHSCORES] [LIMIT offset count] 在分数的指定区间内返回数据,从大到小排列
zcard key 返回集合中所有的元素的数量
zcount key min max 统计分数区间内的元素个数
zrem key member 删除该集合下,指定值的元素
zrank key member 返回该值在集合中的排名,从0开始
zincrby key increment member 为元素的score加上增量

六、配置文件
1.配置文件需要放在redis-server后的第一个参数位置,例如 redis-server redis.conf
2.include /path/to/local.conf :引入一个父配置文件,引入后,子文件拥有父文件中所有的配置,子文件中同名的属性,覆盖父文件中同名的属性!
3.bind 127.0.0.1:bind用来绑定redis启动后监听的指定的ip地址。客户端只能访问bind绑定的主机。
protected mode:护模式是一层安全层服务!在没有指定bind和没有设置密码时,保护模式默认会启动,启动后只允许本机访问!
4.port 6379:在指定的端口上进行监听,默认是 6379。当端口设置为0时,Redis就不会在TCP socket上进行监听
5.pidfile /var/run/redis_6379.pid:redis服务启动后,进程号保存的文件
6.daemonize yes:是都启动守护线程,使用守护线程(后台)启动
7.logfile “”:日志记录的文件,如果是守护进程模式启动,默认无日志,需要显式配置日志文件!
解释:日志文件名称为空时,日志将会输出到 /dev/null(俗称黑洞,即无日志)
8.持久化,见下面

七、持久化 目的:redis在内存中工作,写的数据都是保存在内存中,一旦redis服务端进程崩溃或断电等故障,都会丢失数据需要提供一种机制,可以将内存中的数据定期备份到磁盘,保证数据安全!
1.RDB
a.快照备份(全盘备份)!默认开启RDB!
b.备份:redis服务端,没间隔一段时间,将redis服务端内存中所有的数据,以快照形式保存到磁盘!
恢复: redis服务端进程在启动时,会从配置的指定目录中读取快照文件,将快照中存放的数据加载到内存
备份方式:
rdbcompression yes:是否在持久化到dump.rdb文件时使用LZF来压缩字符串 此配置表示:Redis采用LZF(一种高效的压缩算法)算法进行字符串对象数据的压缩,其性能较高。虽然LZF算法会消耗部分CPU性能,但是其数据压缩能够较高,所以建议不要关闭;如果你不想耗费你的CPU处理能力,你可以设置为 no,但是这会导致你的数据会很大.
c.RDB的缺点是最后一次持久化后的数据可能丢失。
e.相关参数:
dir ./: 快照文件保存的目录!默认为redis-server进程启动的当前目录
dbfilename dump.rdb: 快照文件名
f.触发机制
主动触发(客户端输入一下命令时,会触发备份):
①save(主进程阻塞) / bgsave(主进程不阻塞)
②shutdown
③flushall, 备份后的快照文件中没有数据

		自动触发(在配置文件中配置如下参数时):
				save <seconds>  <changes>,
				seconds: 举例上一次备份的时间
				changes: 举例上一次备份发生的写操作数,例如
				save 900 1 :表示距离上一次备份时间大于90秒且写操作数大于1
				save 300 10
				save 60 10000
				配置的3个save为或的关系

	e.异常
	stop-writes-on-bgsave-error yes
	此配置表示后台备份出错时,停止向redis中写入新数据
2.AOF
	a.日志备份(增量备份)! 需要手动开启!如果既有rdb,又有aof,默认采用aof!aof比rdb安全!
	b.备份与恢复
	  备份: aof将写操作命令记录到一个日志文件中!
	  恢复: redis服务端进程启动,读取aof日志文件,从头到尾依次将所有记录的写操作命令执行,重建数据!
	c.优缺点
      AOF缺点,保存后的aof文件过大,占用过多的磁盘空间!日志文件过大时,恢复速度慢!
	  AOF优点:日志人类可读,可写,用来恢复一些致命的失误,例如flushall!
                文件修改导致错误时,可以使用redis-check-aof --fix appendonly.aof修复!(后面再说此参数)
	d.相关参数
		appendonly no:  是否开启aof
		appendfilename "appendonly.aof": 日志文件名称
		dir ./ : 文件保存的目录,和rdb文件放在一起
		aof-load-truncated yes:当aof-load-truncated设置成“yes”,Redis仍会加载一个被截断的AOF文件,同时向用户报告AOF文件被截断,如果设置为no,
		                       Redis会直接返回错误并拒绝启动,这时用户需要使用"redis-check-aof"程序修复AOF,只有这样才能重启Server。
			 (注意,如果AOF文件在执行一半时就出现问题,即使设置aof-load-truncated为 “yes”,Redis也会直接退出并返回错误。				 
		    修复方式:使用命令:redis-check-aof --fix appendonly.aof  (appendonly.aof为aof日志文件)     
		no-appendfsync-on-rewrite:no:在重写时,是否继续向aof文件末尾追加同步的写操作命令,上述配置等价于appendfsync-on-rewrite(在rewrite时仍执行fsync)
		  auto-aof-rewrite-percentage 100
          auto-aof-rewrite-min-size 64mb:默认当AOF大于64MB且相比于上一次rewrite,AOF以扩充了两倍时会触发一次rewrite执行。默认配置如下
	e.备份机制
		appendfsync always/everysec/no:此配置上等价于appendfsync-on-rewrite(在rewrite时仍执行fsync)
			appendfsync always:一旦buffer中有写命令就立刻sync(同步)到磁盘
			appendfsync everysec :每间隔1秒将写命令sync到磁盘,默认为appendfsync everysec,这样最多只会丢失一秒的数据
			appendfsync no :由操作系统自动决定什么时候将写命令sync到磁盘

八、两种持久化方式优缺点
1.优缺点对比
优点:
RDB:①备份的文件紧凑,节省空间
②备份的速度快,恢复速度快

	AOF:①安全,默认最多丢失1秒的数据
		②日志人类可读可写,恢复一些致命的操作	
缺点: 
	RDB: ①不安全,有可能丢失最后一次备份后的数据
	
	AOF:  日志冗余过多,占用磁盘空间多,数据过多时,恢复时间长!	
2.取舍?
	根据使用redis的目的进行取舍!
	
	redis可以用来作为数据库,缓存,消息中间件!
	
	作为缓存来用,可以只启用rdb,或两者都不用!
	
	作为数据库,两者都启动!				

九、事务
1.关系型数据库事务与redis事务
关系型数据库中的事务,ACID特性!在关系型数据库中,一个事务是一个原子!
Redis中的事务,将多个命令组队,一次性提交,防止多个有连续关系的命令被其他客户端送发送的命令打断!事务中的命令按照入队的顺序依次执行! 在redis中,事务中的每条命令是一个原子!互不影响!(就是其中一个执行失败,其他也会执行成功(运行时异常),但是如果组队过程中就发生了错误(编译时异常),那么这个事务提交将会失败,即都不会执行成功)
2.常用操作:
multi : 开启事务
exec: 提交事务
discard : 取消事务
例1:multi;set k1 v1;set k2 v2;exec/discard
例2:multi;set k1 v1;incr k1;set k2 v2;exec/discard 很明显,当提交事务时,执行到incr k1(自增)时,会报错,但是并不影响set k2 v2的执行
例3:multi;set k1 v1;seab k1 v1;set k2 v2;exec 当输入seab k1 v1这个命令时就发生了错误(编译就错误了),则提交事务也会失败,全都不会执行

十、锁
1.悲观锁
操作前(无论是读还是写操作)就会把相关资源锁定,不允许自己执行期间有其他操作干扰,悲观锁适合多写少读的场景!(synchronized就是悲观锁)
2.乐观锁
操作前(无论是读还是写操作)不会锁定资源,操作前会做一个标记,万一发生了其他操作的干扰(例如另外一个线程修改了数据,每次提交时,就会进行一个标记校验,如果比较校验前后不一致),那么本次操作将被放弃。适合多读少写或只读不写的场景!(乐观锁核心就是check-and-set,即先检查,后操作)
3.Redis不支持悲观锁。Redis作为缓存服务器使用时,以读操作为主,很少写操作,相应的操作被打断的几率较少。不采用悲观锁是为了防止降低性能。
加锁:watch key
加锁一般需要和事务一起使用!
例如:
客户端1:set k1 100;watch k1(启用锁,锁住k1);multi(开启事务);—>此时被客户端2抢占CPU,执行set k1 40;此时客户端1继续执行decrby k1 50(k1自减50);–>exec提交,则会返回nil(即null),提交事务执行失败

十一、发布订阅
subscribe [频道] 订阅频道
publish [频道][消息] 向指定频道发布消息

十二、主从复制[从机可以是单台服务器,也可以是多台,但是端口不能一样]
1.准备配置文件
a)准备一个base.conf配置文件,其他机器继承至base.conf,base.conf(关闭aof备份)
b)其他机器配置文件示例如下配置(端口不能一致):
[可以准备3台机器,1台主机,2台从机]
include /root/myredis/base.conf
port 6379
pidfile /var/run/redis_6379.pid
logfile /root/myredis/log_6379.conf
dbfilename dump_6379.rdb
c)分别启动三台机器
2.主从建立[只需要配置从机即可,无需配置主机]
a)临时建立:slaveof ip/主机名 port [ip与端口为主机信息]
例如在6380从机客户端配置 slaveof 192.168.1.3 6379 ,代表6380为从机,6379为主机[从机默认只读(可修改slave-read-only配置),主机可读可写]
查看主从配置命令:[info replication]
b)永久建立[需要写在配置文件里面]
在从机配置文件中新增 slaveof 主机名或主机IP 端口,就可以了
十三、哨兵模式
目的:由于主机宕机后,从机无法自动切换为主机,所以可以采用哨兵模式[哨兵也是一个redis服务]
a)设置哨兵配置文件
vim sentinel.conf
添加一下两行即可
bind 192.168.1.3
sentinel monitor mymaster 127.0.0.1 6379 1
#配置解释
sentinel monitor 自定义监控名称 主机ip 主机端口 客观下线投票数[只需要配置主机即可,他会自动检测到从机]
b)开启哨兵服务
redis-sentinel sentinel.conf

十三、redis集群
一、安装环境
yum -y install ruby
yum -y install rubygems
gem install --local redis-3.2.0.gem
二、准备6个配置文件
6379,6380,6381,6382,6383,6384
1.分别按照一下模板配置:
include /root/myredis/base.conf
#本机自己的配置
port 6379
pidfile “/var/run/redis_6379.pid”
logfile “/root/myredis/log_6379.conf”
dbfilename “dump_6379.rdb”
#日志存放地址
dir “/root/myredis/cluster”
# 打开集群模式
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
2.分别启动各台机器服务
~ 3.组成集群 [转到redis解压的目录的src目录下]
输入命令: ./redis-trib.rb create --replicas 1 ./redis-trib.rb create --replicas 1 192.168.1.3:6379 192.168.1.3:6380 192.168.1.3:6381 192.168.1.3:6382 192.168.1.3:6383 192.168.1.3:6384
4.原理 ①在redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器插槽,redis会报错,并告知应前往的redis实例地址和端口。
②redis-cli客户端提供了 –c 参数实现自动重定向。如 redis-cli -c –p 6379 登入后,再录入、查询键值对可以自动重定向。
③采用哈希算法后,会自动地分配slot,而 不在一个slot下的键值,是不能使用mget,mset等多键操作
④可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。
如果需要自动计算槽并且重定向,redis-cli -h 192.168.1.3 -p 6379 -c [即在尾端加-c可以自动重定向]
批量添加数据,例如mset {k}k1 v1 {k}k2 v2 {k}k3 v3
get {k}k1
⑤存储数据
CLUSTER KEYSLOT 计算键 key 应该被放置在哪个槽上
CLUSTER COUNTKEYSINSLOT 返回槽 slot 目前包含的键值对数量

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值