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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天意不可违.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值