Linux中Redis的安装和配置以及Redis的数据操作
Redis是一种基于键值对的NoSQL数据库,它提供了对多种数据类型(字符串、哈希、列表、集合、有序集合、位图等)的支持,能够满足很多应用场景的需求。Redis将数据放在内存中,因此读写性能是非常惊人的。Redis也提供了持久化机制,能够将内存中的数据保存到硬盘上,在发生意外状况时数据也不会丢掉。
一、Redis简介
Redi是remote dictionary server的缩写,它是一个用ANSI C编写的高性能的key-value存储系统,与其他的key-value存储系统相比,Redis有以下特点:
-
Redis的读写性能极高,并且有丰富的特性(发布/订阅、事务、通知等)。
-
Redis支持数据的持久化(RDB和AOF两种方式),可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
-
Redis支持多种数据类型,包括:string,hash,list,set,zset,bitmap,hyperloglog等。
-
Redis支持主从复制(实现读写分离)以及哨兵模式(监控master是否宕机并自动调整配置)。
-
Redis支持分布式集群,可以很容易的通过水平扩展来提升系统的整体性能。
-
Redis基于TCP提供的可靠传输服务器进行通信,很多编程语言都提供了Redis客户端支持。
二、Redis的应用场景
1.高速缓存 - 将不常变化但又经常被访问的热点数据放到Redis数据库中,可以大大降低关系型数据库的压力,从而提升系统的响应性能。
2.排行榜 - 很多网站都有排行榜功能,利用Redis中的列表和有序集合可以非常方便的构造各种排行榜系统。
3.商品秒杀/投票点赞 - Redis提供了对计数操作的支持,可利用Redis的计数器通过+1或-1的操作来实现,从而避免了使用关系型数据的update操作。
4.分布式锁 - 利用Redis可以跨多台服务器实现分布式锁(类似于线程锁,但是能够被多台机器上的多个线程或进程共享)的功能,用于实现一个阻塞式操作。
5.消息队列 - 消息队列和高速缓存一样,是一个大型网站不可缺少的基础服务,可以实现业务解耦和非实时业务削峰等特性。
三、Redis的安装和配置
可以通过在Redis的官方网站下载Redis的源代码,解压归档之后通过make工具对源代码进行构建并安装。
wget http://download.redis.io/releases/redis-6.0.8.tar.gz
tar xzf redis-6.0.8.tar.gz
cd redis-6.0.8
make && make install
四、Redis的配置
在redis源代码目录下有一个名为redis.conf的配置文件,我们可以先查看一下该文件:vim redis.conf
1.配置将Redis服务绑定到指定的IP地址和端口。
bind 127.0.0.1
port 6379
2.设置后台运行(以守护进程方式运行)
daemonize yes
3.设置日志级别,可选值(debug:调试,verbose:详细,notice:通知,warning:警告)
loglevel warning
4.配置数据库的数量,默认为16个
databases 16
5.配置数据写入规则
save 900 1 # 900秒内修改过1个key,写入一次数据库
save 300 10 # 300秒内修改过10个key,写入一次数据库
save 60 10000 # 60秒内修改过10000个key,写入一次数据库
6.配置Redis的持久化机制 - RDB
rdbcompression yes # 压缩RDB文件
rdbchecksum yes # 对RDB文件进行校验
dbfilename dump.rdb # RDB数据库文件的文件名
dir /var/local/redis # RDB文件保存的目录
7.配置Redis的持久化机制 - AOF
appendonly no
appendfilename "appendonly.aof"
8.配置Redis的主从复制,通过主从复制可以实现读写分离
replicaof 主机IP地址 主机端口
9.配置慢查询
slowlog-log-slower-than 10000 # 一次操作超过10000毫秒被视作一次慢查询
slowlog-max-len 128 # 最多纪录128次慢查询
五、Redis的服务器和客户端
启动Redis服务器
redis-server redis.conf
启动Redis客户端连接服务器
redis-cli -h localhost -p 6379
六、Redis持久化
Redis在运行时,所有的数据都保存在内存里,进程结束以后,会将数据写入到硬盘中。启动时,会读取硬盘里的内容,并将内容全部加载到内存中(会大量的占用内存)。
Redis的持久化有两种形式:RDB和AOF
RDB
默认的持久化方式,是对内存中的数据进行镜像,并以二进制的形式保存到dump.rdb文件中。会根据配置文件的时间节点对文件进行持久化。
save 900 1
save 300 10
save 60 10000
优点:速度快,直接镜像内存里的数据,文件小。
缺点:数据有可能会丢失,在两次保存间隔内的数据,有可能会丢失。
AOF
AOF持久化,将修改的每一条指令记录进appendonly.aof中,需要修改redis.conf文件,来打开aof功能。
appendonly no
appendfsync always #每次有新命令追加到aof文件时就执行一个持久化,非常慢但安全
appendfsync everysec #每秒执行一次持久化,足够快并且在故障时只会丢失1秒钟的数据
appendfsync no #从不持久化,将数据交给操作系统来处理。redis处理命令速度加快但不安全
优点:适合保存增量数据,数据不会丢失。
缺点:文件体积大,恢复时间长。
七、Redis数据操作
字符串操作
1.set
语法:SET key value [EX seconds] [PX milliseconds] [NX|XX]
将字符串值 value 关联到 key 。如果 key 已经持有其他值, SET 就覆写旧值, 无视类型。
当 SET 命令对一个带有生存时间(TTL)的键进行设置之后, 该键原有的 TTL 将被清除。
- EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value 。
- PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。
redis> set key “value”
OK
2.get
语法:GET key
返回与键 key 相关联的字符串值。
redis> set key "value"
OK
redis> get key
"value"
3.setex
语法:SETEX key seconds value
将键 key 的值设置为 value , 并将键 key 的生存时间设置为 seconds 秒钟。
redis> setex user_id 10 104
OK
redis> get user_id # 值
"104"
redis> ttl user_id # 剩余生存时间
(integer) 5
4.setnx
语法:SETNX key value
只在键 key 不存在的情况下, 将键 key 的值设置为 value 。若键 key 已经存在, 则 SETNX 命令不做任何动作。
redis> setnx name "chen"
(integer) 1
redis> setnx name "chenjiahe" # 覆盖name ,失败
(integer) 0
5.mset
语法:MSET key value [key value …]
同时为多个键设置值。如果某个给定键已经存在, 那么 MSET 将使用新值去覆盖旧值。
redis> mset date "2012.3.30" time "11:00 a.m." weather "sunny"
OK
redis> mget date time weather
1) "2012.3.30"
2) "11:00 a.m."
3) "sunny"
6.mget
语法:MGET key [key …]
返回给定的一个或多个字符串键的值。
redis> set redis redis.com
OK
redis> set mongodb mongodb.org
OK
redis> mget redis mongodb
1) "redis.com"
2) "mongodb.org"
7.strlen
语法:STRLEN key
返回键 key 储存的字符串值的长度。
redis> set mykey "Hello world"
OK
redis> strlen mykey
(integer) 11
8.incr
语法:INCR key
为键 key 储存的数字值加上一。
如果键 key 不存在, 那么它的值会先被初始化为 0 , 然后再执行 INCR 命令。
如果键 key 储存的值不能被解释为数字, 那么 INCR 命令将返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
redis> set age 21
OK
redis> incr age
(integer) 22
redis> get age
"22" # 数字值在Redis中以字符串形式保存
9.incrby
语法:INCRBY key increment
为键 key 储存的数字值加上增量 increment 。
redis> set rank 5
OK
redis> incrby rank 5
(integer) 10
redis> get rank
"10"
10.decr
语法:DECR key
为键 key 储存的数字值减去一。
redis> set age 21
OK
redis> decr age
(integer) 20
11.decrby
语法:DECRBY key decrement
将键 key 储存的整数值减去减量 decrement 。
redis> set age 100
OK
redis> decrby age 50
(integer) 50
12.append
语法:APPEND key value
如果键 key 已经存在并且它的值是一个字符串, APPEND 命令将把 value 追加到键 key 现有值的末尾。
redis> set name "chen"
OK
redis> append name "jiahe"
(integer) 9 # 长度增加后为9个字符
redis> get name
"chenjiahe"
哈希表
1.hset
语法:HSET hash field value
将哈希表 hash 中域 field 的值设置为 value 。
如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作。
如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖。
redis> hset dog name mango color yellow
(integer) 1
2.hget
语法:HGET hash field
返回哈希表中给定域的值。
redis> hset dog name mango color yellow
(integer) 1
redis> hget dog color
"yellow"
3.hexists
语法:HEXISTS hash field
检查给定域 field 是否存在于哈希表 hash 当中。
redis> hexists dog age
(integer) 0 # dog中没有age 返回1则是存在
4.hdel
语法:HDEL key field [field …]
删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
redis> hdel dog name
(integer) 1
5.hlen
语法:HLEN key
返回哈希表 key 中域的数量。
redis> hlen dog
(integer) 1
6.hstrlen
语法:HSTRLEN key field
返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度(string length)。
redis> hstrlen dog name
(integer) 5 # name是mango
7.hkeys
语法:HKEYS key
返回哈希表 key 中的所有域。
redis> hkeys dog
1) "name"
8.hvals
语法:HVALS key
返回哈希表 key 中所有域的值。
redis> hvals dog
1) "mango"
9.hgetall
语法:HGETALL key
返回哈希表 key 中,所有的域和值。
redis> hgetall dog
1) "name" # 域
2) "mango" # 值
列表
1.lpush
语法:LPUSH key value [value …]
将一个或多个值 value 插入到列表 key 的表头
如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头
redis> lpush names cjh cxq mx
(integer) 3
redis> lrange mylist 0 -1
1) "mx"
2) "cxq"
3) "cjh"
2.lrange
语法:LRANGE key start stop
返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
redis> lrange names 0 2
1) "mx"
2) "cxq"
3) "cjh"
3.rpush
语法:RPUSH key value [value …]
将一个或多个值 value 插入到列表 key 的表尾(最右边)。
如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾
redis> rpush mylist a b c
(integer) 3
redis> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4.lpop
语法:LPOP key
移除并返回列表 key 的头元素。
redis> lpop names
"mx" # 参考前面的names mx被移除
5.rpop
语法:RPOP key
移除并返回列表 key 的尾元素。
redis> rpop name
"cjh" # cjh被移除
6.lset
语法:LSET key index value
将列表 key 下标为 index 的元素的值设置为 value 。
redis> lset names 1 cgx
OK
redis> lrange names 0 -1
1) "cxq"
2) "cgx"
7.llen
语法:LLEN key
返回列表 key 的长度。
redis> llen names
(integer) 2
8.lindex
语法:LINDEX key index
返回列表 key 中,下标为 index 的元素。
redis> lindex names 0
"cxq"
集合
1.sadd
语法:SADD key member [member …]
将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
redis> sadd lol zed ez
(integer) 2
2.sismember
语法:SISMEMBER key member
判断 member 元素是否集合 key 的成员。
redis> sismember lol cjh
(integer) 0
3.srandmember
语法:SRANDMEMBER key [count]
如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。
如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
redis> srandmember lol
"ez"
4.smembers
语法:SMEMBERS key
返回集合 key 中的所有成员。
redis> smembers lol
1) "zed"
2) "ez"
5.sdiff
语法:SDIFF key [key …]
返回一个集合的全部成员,该集合是所有给定集合之间的差集。
redis> smembers peter_movies
1) "bet man"
2) "start war"
3) "2012"
redis> smembers joe_movies
1) "hi, lady"
2) "Fast Five"
3) "2012"
redis> sdiff peter_movies joe_movies
1) "bet man"
2) "start war"
有序集合
1.zadd
语法:ZADD key score member [[score member] [score member] …]
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
score 值可以是整数值或双精度浮点数。
redis> zadd salary 50 cjh 60 mx 40 cxq
(integer) 3
2.zrange
语法:ZRANGE key start stop [WITHSCORES]
返回有序集 key 中,指定区间内的成员。
其中成员的位置按 score 值递增(从小到大)来排序。
redis> zrange salary 0 -1 withscores
1)"cxq"
2)"40"
3)"cjh"
4)"50"
5)"mx"
6)"60"
3.zrank
语法:ZRANK key member
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
排名以 0 为底,也就是说, score 值最小的成员排名为 0 。
redis> zrank salary cjh
(integer) 1
4.zrevrange
语法:ZREVRANGE key start stop [WITHSCORES]
返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递减(从大到小)来排列。
redis> zrevrange salary 0 1 withscores
1) "mx"
2) "60"
3) "cjh"
4) "50"
具体操作请参考:http://redisdoc.com/index.html