Redis的安装和使用
redis的简单使用
1、Redis的安装
1、查看是否安装了redis的编译环境(redis是由C语言编写的,它的运行需要C环境)
rpm -qa | grep -i gcc
若没有安装redis的编译环境,使用如下命令安装
安装命令:yum install gcc-c++
2、从redis官网下载redis的压缩包。
3、使用Xftp工具将redis压缩包上传到linux。
4、将redis压缩包解压到/usr/software
tar -xvf redis-7.0.0.tar.gz -C /usr/software
5、进入到redis-7.0.0目录
cd /usr/software/redis-7.0.0
6、在redis-7.0.0目录输入make命令,对解压后的文件进行编译
7、安装redis(需要进入到redis解压后的目录中进行安装)
make PREFIX=/usr/software/redis install
PREFIX=/usr/software/redis的意思是将redis安装到/usr/software/redis目录下
安装完成!在/usr/software目录下,会有一个redis目录
8、进入redis目录,下面有个bin目录,bin目录下有几个可执行文件
redis-benchmark ----性能测试工具
redis-check-aof ----AOF文件修复工具
redis-check-dump ----RDB文件检查工具(快照持久化文件)
redis-cli ----命令行客户端
redis-server ----redis服务器启动命令
2、Redis的启动和停止
2.1、前端模式启动(不推荐使用)
#进入到/usr/soft/redis/bin目录下,执行redis-server
cd /usr/software/redis/bin
./redis-server
缺点:启动完成后,不能再进行其他操作,如果要操作必须使用ctrl+c,此时redis-server程序结束,不推荐使用此方法。
2.2、后端模式启动(推荐使用)
(1)需要使用redis的配置文件redis.conf,该文件的位置:/usr/software/redis-7.0.0/redis.conf,在这个配置文件中,可以修改端口号等信息,为了方便使用,将该配置文件copy一份到redis的bin目录下。
cp /usr/software/redis-7.0.0/redis.conf /usr/software/redis/bin
(2)然后修改该配置文件中的daemonize no为daemonize yes
vim /usr/software/redis/bin/redis.conf
先不进入编辑模式,内容太多,需要搜索,在命令模式下输入/daemonize no,回车。
然后再按 Shift + A,进入编辑模式并将光标定位在当前行的末尾,将no改为yes
按esc退出编辑模式,按:wq保存修改并退出文件。
(3)启动redis
cd /usr/software/redis/bin
./redis-server redis.conf
2.3、关闭Redis
强制结束Redis程序,可能会导致redis持久化数据丢失!企业中禁止使用!
查看redis进程端口占用
ps -ef | grep -i redis
强制杀死进程:kill -9 5718
正确停止Redis的方式应该是向Redis发送shutdown命令
方式一:
cd /usr/sfotware/redis/bin
./redis-cli shutdown
方式二:
3、redis的简单使用
3.1、ping
ping [message]:测试客户端与Redis服务的连接是否正常,如果连接正常会收到回复PONG(如果指定message,则原样回复)。
3.2、set/get:存储值。(get命令只能用于获取String value)
set value为中文,get取值时乱码。
解决方法:连接redis服务器时使用命令:./redis-cli --raw
3.3、echo
echo message:在命令行打印一些内容
3.4、info
info:获取服务器的信息和相关统计。
3.5、操作key
keys pattern:获取所有与pattern匹配的key。pattern中 * 表示任意多个字符,?表示任意一个字符
del key1 ke2 key3:删除key对应的数据
exists key:判断指定的key是否存在,0代表不存在,大于0表示存在
rename oldkey newkey:为当前的key重命名
expire key :设置超时时间,单位:秒(超时后,会删除设置超时的key的数据)
ttl key:获取该key所剩的超时时间,如果没有设置,返回-1,返回-2表示key本身不存在。
type key:获取指定的key对应数据的类型:string、hash、list、set或zset
3.5、操作value
incr key:将指定的key对应的value递增1。
decr key:将指定的key的value递减1。
incrby key increment:将指定的key的value增加increment。
decrby key decrment:将指定的key的value减少decrement。
如果希望操作小数,可以使用命令:incrbyfloat key increment,没有decrbyfloat,可以使用正数表示增加,负数表示减少。
3.6、字符串拼接
append key value:如果该key存在,则在原有的value后追加该值;如果该key不存在,则重新创建一个key/value,返回值为追加后的长度!
4、redis的五种数据类型
value支持五种基本数据类型:
- 字符串(String)
- 哈希(hash)
- 列表(list)
- 集合(set)
- 有序集合(sorted set)
5、hash常用命令
5.1、hash赋值
hset key field value:为指定的key设定field-value对(键值对)。
5.2、hash取值
hget key field:获取key中的单个field的值(单个)
hmget key fileds:获取key中的多个filed的值(多个)
hgetall key:获取key中的所有filed-value(所有)
5.3、hash删除
hdel key field [field … ] :可以删除一个或多个字段,返回值是被删除的字段个数。
del key :删除整个hash
5.4、其它命令
hexists key field:判断指定的key中的filed是否存在(只能单个)
hlen key:获取key所包含的field的数量
hkeys key :获得key所有field
hvals key:获得key所有的value
6、list常用命令
6.1、两端插入(列表插入值)
lpush key value…:在list的头部插入所有给定的值,如果该key不存在,则自动创建新list再操作,返回所有元素的个数。(前插法)
rpush key value…:在list的尾部插入所有给定的值,如果该key不存在,则自动创建新list再操作,返回所有元素的个数。(后插法)
lpushx key value [value…]:将给定的值插入到已存在的列表头部,如果列表不存在,则不插入。
rpushx key value [value…]:将给定的值插入到已存在的列表尾部,如果列表不存在,则不插入。
6.2、两端弹出(删除)
lpop key [count]:弹出并返回list中第一个元素,如果该key不存在,返回(nil)。count表示弹出几个,默认为1(左→右)
rpop key [count]:弹出并返回list中最后一个元素,如果该key不存在,返回(nil)。count表示弹出几个,默认为1(右→左)
6.3、获取长度
llen key:返回指定的key关联的链表中的元素的数量,如果list不存在,返回0。
6.4、删除多个相同的value
lrem key count value:删除count个值为value的元素,count 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
6.5、根据index修改值
lset key index value:设置链表中索引为index的元素值,0表示第一个,-1表示最后一个,索引不存在则抛异常。
6.6、在指定value前后插入
linsert key before|after pivot value:在pivot元素前或者后插入value。
6.7、操作两个list
rpoplpush resource destination:移除resource列表的最后一个元素,并将该元素添加到destination列表的头部。
7、set(Set集合中不允许出现重复的元素)
7.1、存值和取值
sadd key member… :向Set中添加值,如果值已存在则不添加,返回添加成功的元素个数。
smembers key:获得集合中的所有元素。
srem key value… :删除Set中指定的值,返回移除元素的个数。
7.2、判断某个值是否存在
sismember key member:判断Set中是否存在指定的值,1表示存在,0表示不存在或者该key本身就不存在。
如果希望准确判断到底是key本身不存在,还是key对应的set中的值不存在,可以结合exists key先判断key对应的set是否存在(返回0表示key对应的set不存在),从而得出准确结论。
7.3 、差集、并集、交集
7.3.1、差集
sdiff key1 key2…:只在key1中存在的元素,称为“差集”。
7.3.2、交集
sinter key1 key2…:在key1和key2中都存在的元素,称为“交集”。
7.3.3、并集
sunion key1 key2…:在key1和key2中的所有元素(去重),称为“并集”。
7.3.4、获取差集、并集、交集的结果
sdiffstore destination key1 key2…:将返回的差集存储在destination上
sinterstore destination key1 key2:将返回的交集存储在destination上
sunionstore destination key1 key2:将返回的并集存储在destination上
7.4、获取随机成员
scard key:获取set中成员的数量
srandmember key:随机返回set中的一个成员,可以用于抽取幸运用户!
8、 zset(有序集合)
set和zset主要差别是Sorted-Set中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Set中的成员必须是唯一的,但是分数(score)却是可以重复的。
8.1 添加元素
zadd key score member score2 member2 …:将所有成员以及该成员的分数存放到sorted-set中。如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
8.2 获取元素
zscore key member:返回指定成员的分数
zrange key start stop [withscores]:按分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素),[withscores]参数表明返回的成员包含其分数。(正序排列)
zrevrange key start stop [withscores]:按分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素),(反序排列)
zrangebyscore key min max [withscores] [limit offset count]:返回分数在[min,max]的成员并按照分数从低到高排序。[withscores]:显示分数;
[limit offset count]:offset,索引从offset开始的count个元素。
8.2 、删除元素
zrem key member [member…]:移除集合中指定的成员,可以指定多个成员。
zremrangebyrank key start stop:删除索引在start-stop之间的成员,包括两端的成员。
zremrangebyscore key min max:按照分数范围删除元素
zremrangebylex key min max:按照字典(元素)范围删除元素
该命令的使用前提是所有元素的分数必须一致!
8.3、改变数值
zincrby key increment member:给指定的成员增加指定的分数。返回值是更改后的分数。
该命令常用于投票,或者点击某个微博标题增加热度的时候使用!
8.4、 其他命令
zcount key min max:获取分数在[min,max]之间的成员个数
zrank key member:返回成员在集合中的排名。(从小到大)
zrevrank key member:返回成员在集合中的排名。(从大到小)
9、三种特殊数据类型
9.1、bitmaps(打卡计数)
位图:一般用于完成类似打卡这样的操作。例如:记录一周的打卡状态。
9.2、hyperloglogs
统计集合中不重复元素的个数。特点:不管有多少个元素,只需要占用12KB的内存!
#往集合添加数据
pfadd key element...
#统计集合中不重复元素的个数
pfcount key
#将多个 HyperLogLog 合并为一个 HyperLogLog
pfmerge destkey sourcekey [sourcekey ...]
9.3、geospatial
geospatial可以用于地理空间位置的计算,例如计算两地之间的距离、某一地理位置指定半径范围内的所有地理位置等。
#添加北京和深圳的地理位置:
geoadd citys 114.085947 22.547 shenzheng 116.405285 39.904989 beijing
#获取北京到深圳的直线距离:
geodist citys shenzheng beijing km
#返回指定地理位置的经纬度(和添加时的经纬度有细微的区别)
geopos citys shenzheng
#以给定的经纬度为中心, 返回与中心的距离不超过给定最大距离的所有位置元素。
georadius citys 114.085947 22.547 2000 km
#获取指定的地理位置指定半径内的所有元素
georadiusbymember citys shenzheng 2000 km
10、redis高级
10.1、多数据库
一个redis实例(连接)包括16个数据库,下标从0到15,客户端默认使用第0号数据库。
select index:切换到指定的库,索引范围为0-15
move key index:将当前库指定的key移植到指定的库(剪切)
dbsize:返回当前数据库中 key 的数目。
flushdb:删除当前选择数据库中的所有key。
flushall:删除所有数据库中的所有key。
10.2、事务
10.2.1、事务中的命令
multi:开启事务用于标记事务的开始,其后执行的命令都将被存入命令队列,直到执行exec时,这些命令才会被执行。
exec:事务提交。
discard:事务回滚。
watch:监视某个数据的变化。
10.2.3、事务中的异常
10.2.3、回滚事务
10.2.4、redis实现乐观锁
悲观锁:悲观锁在操作数据时是直接把数据上锁,直到操作完成之后才会释放锁,在上锁期间其他人不能操作数据。
乐观锁:只有提交数据时,才会去判断在此期间别人是否修改了数据,如果别人修改了数据则放弃操作,否则执行操作。
redis中,通过watch命令,来对某个要在事务中操作的数据进行监视,如果在最终执行的时候,发现监视的数据已经被修改了,则放弃事务对监视数据的改变。(类似乐观锁)
10.3、消息订阅与发布
subscribe channel:订阅频道。此时如果没有人“发布”消息,第一个窗口处于等待状态。
publish channel content:在指定的频道中发布消息。打开第二个窗口,在mychannel频道中发布消息"hello everyone"。
第一个窗口收到第二个窗口发布的消息。
psubscribe channel*:订阅的频道支持模式(pattern),可以进行批量订阅频道。
10.4、 redis持久化
10.4.1、两种方式
Redis支持两种方式的持久化
- RDB方式(默认支持,无需配置)
该机制是以指定的时间间隔内将内存中的数据集快照写入磁盘。
优势:备份恢复
劣势:数据丢失
当客户端调用shutdown命令时,在redis服务器在关闭之前,会自动持久化内存中的数据到磁盘,除非在关闭redis时不进行持久化:shutdown nosave,或者强制杀死redis进程:kill -9 进程id。 - AOF方式
该机制将以日志的形式记录服务器所处理的每一个写操作(对数据产生改变的操作),在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。
优势:高数据持久性,相较于RDB
劣势:AOF在运行效率上往往会慢于RDB
10.4.2、AOF的使用
1.修改redis.conf的appendonly no为appendonly yes,开启AOF
2.清空数据库:flushall
3.设置一些数据
4.关闭redis:shutdown nosave
5.启动redis,并查看数据
10.4、 启动多个redis
方式一:
#开启默认redis服务器
./redis-server redis.conf
#开启指定端口号的redis服务器
./redis-server redis.conf --port 6380
关闭默认redis服务器:./redis-cli shutdown
关闭指定端口号redis服务器:./redis-cli -p 端口号 shutdown
方式二:复制redis.conf文件,修改端口【推荐使用】
1)cp redis.conf redis6380.conf
2)修改redis6380.conf中的启动端口为6380
3)启动redis时,指定配置文件redis6380.conf
10.5、主从复制(主服务器写入数据,从服务器只读)
1、创建两个空文本 redis6380.conf和redis6381.conf
命令:touch redis6380.conf redis6381.conf
2、编辑从服务器的配置文件
vim redis6380.conf
include redis.conf
#后端启动
daemonize yes
#端口号
port 6380
#指定主服务器的IP和端口
slaveof 127.0.0.1 6379
vim redis6381.conf
include redis.conf
#后端启动
daemonize yes
#端口号
port 6381
#指定主服务器的IP和端口
slaveof 127.0.0.1 6379
3、启动主从服务器
端口号为6379的redis为主服务器(Master)
端口号为6380和6381的redis为从服务器(Salve)
4、登录master服务器和slave服务器
info replication:查看服务器信息
测试主写数据,从读数据
登录master服务器,写入数据
登录slave服务器,读取数据
slave服务器写数据失败
slaveof no one:将当前slave服务器升为master服务器。
slaveof host port:将当前服务器添加到host port的从服务器中。
10.6、高可用哨兵Sentinel
Sentinel 系统有三个主要任务:
监控:Sentinel 不断的检查主服务和从服务器是否按照预期正常工作。
提醒:被监控的 Redis 出现问题时,Sentinel 会通知管理员或其他应用程序。
自动故障转移:监控的主 Redis 不能正常工作,Sentinel 会开始进行故障迁移操作。将一个从服务器升级新的主服务器。让其他从服务器挂到新的主服务器。同时向客户端提供新的主服务器地址。
1)在/usr/software/redis/bin下新建3个哨兵配置文件:
touch sentinel26379.conf sentinel26380.conf sentinel26381.conf
2)vim sentinel26379.conf:修改文件
mater服务器的ip:127.0.0.1,port:9379
#导入redis-7.0.0下的sentinel.conf
include /usr/software/redis-7.0.0/sentinel.conf
#需要改变的从这开始(覆盖)后端启动
daemonize yes
#master服务器的信息,IP,port,对mater服务器监视
sentinel monitor m6379 127.0.0.1 6379 2
vim sentinel26380.conf:修改文件
#导入redis-7.0.0下的sentinel.conf
include /usr/software/redis-7.0.0/sentinel.conf
#需要改变的从这开始(覆盖)后端启动
daemonize yes
port 26380
#master服务器的信息,IP,port,对mater服务器监视
sentinel monitor m6379 127.0.0.1 6379 2
vim sentinel26381.conf:修改文件
#导入redis-7.0.0下的sentinel.conf
include /usr/software/redis-7.0.0/sentinel.conf
#需要改变的从这开始(覆盖)后端启动
daemonize yes
port 26381
#master服务器的信息,IP,port,对mater服务器监视
sentinel monitor m6379 127.0.0.1 6379 2
3)修改完成之后,启动3个哨兵进程
./redis- sentinel sentinel26379.conf
./redis- sentinel sentinel26380.conf
./redis- sentinel sentinel26381.conf
4)手动干掉master,稍等1分钟,再次查看当前master/slave情况。
发现127.0.0.1:6380由slave升为master服务器,127.0.0.1:6381变为新master的slave。(这就是哨兵,发现master故障,从master的slave选择一个作为新master,把其他slave改为新master的slave,保证注册服务器架构)
10.7、redis设置密码
1、vim redis.conf:修改配置文件
修改前
修改后
2、.redis-server redis.conf:启动redis。./redis-cli:连接redis服务器。发现redis命令失效,没有权限。
3、访问有密码的 Redis 两种方式:
①:在连接到客户端后,使用命令:auth 密码,命令执行成功后,可以正常使用 Redis
②:在连接客户端时使用 -a 密码。例如 ./redis-cli -h ip -p port -a password
更多推荐
所有评论(0)