Redis 是完全开源免费的,遵守 BSD 协议,是一个灵活的高性能 key-value 数据结构存储,可以用来作为数据库、缓存和消息队列。
Redis 比其他 key-value 缓存产品有以下三个特点:
- Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载到内存使用。
- Redis 不仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。
- Redis 支持主从复制,即 master-slave 模式的数据备份。
Redis 的特点
- 高性能: Redis 将所有数据集存储在内存中,可以在入门级 Linux 机器中每秒写(SET)11 万次,读(GET)8.1 万次。Redis 支持 Pipelining 命令,可一次发送多条命令来提高吞吐率,减少通信延迟。
- 持久化:当所有数据都存在于内存中时,可以根据自上次保存以来经过的时间和/或更新次数,使用灵活的策略将更改异步保存在磁盘上。Redis 支持仅附加文件(AOF)持久化模式。
- 数据结构: Redis 支持各种类型的数据结构,例如字符串、散列、集合、列表、带有范围查询的有序集、位图、超级日志和带有半径查询的地理空间索引。
- 原子操作:处理不同数据类型的 Redis 操作是原子操作,因此可以安全地 SET 或 INCR 键,添加和删除集合中的元素等。
- 支持的语言: Redis 支持许多语言,如 C、C++、Erlang、Go、Haskell、Java、Javascript(Node.js)、Lua、Objective-C、Perl、PHP、Python、R、Ruby、Rust、Scala、Smalltalk 等。
- 主/从复制: Redis 遵循非常简单快速的主/从复制。配置文件中只需要一行来设置它,而 Slave 在 Amazon EC2 实例上完成 10 MM key 集的初始同步只需要 21 秒。
- 分片: Redis 支持分片。与其他键值存储一样,跨多个 Redis 实例分发数据集非常容易。
- 可移植: Redis 是用 C 编写的,适用于大多数 POSIX 系统,如 Linux、BSD、Mac OS X、Solaris 等。
Redis 架构
Redis 主要由有两个程序组成:
Redis 客户端 redis-cli
Redis 服务器 redis-server
配置环境:
centos7
redis-6.0.9
[root@redis1 ~]# mkdir -p / data/redis_cluster/redis_6379
[root@redis1 ~]# mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}
[root@redis1 ~]# mkdir /apps
[root@redis1 ~]# cd /apps
[root@redis1 apps]# wget http://download.redis.io/releases/redis-6.0.9.tar.gz
[root@redis1 apps]# tar xf redis-6.0.9.tar.gz -C /opt/redis_cluster/
[root@redis1 apps]# ln -s /opt/redis_cluster/redis-6.0.9/ /opt/redis_cluster/redis
[root@redis1 apps]# cd /opt/redis_cluster/redis
[root@redis1 redis]# make&&make install
[root@redis1 redis]# vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
###以守护进程模式启动
daemonize yes
###绑定的主机地址
bind 10.0.0.31
###监控端口
port 6379
###pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
###设置数据库的数量,默认数据库为0
databases 16
###制定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
###本地数据库的目录
dir /data/redis_cluster/redis_6379
#启动redis_server
[root@redis1 redis]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@redis1 redis]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 10.0.0.31:6379 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 128 [::]:22 [::]:*
#启动redis_cli
[root@redis1 redis]# redis-cli -h 10.0.0.31
10.0.0.31:6379>
#关闭redis-server
10.0.0.31:6379> shutdown
not connected>
安装redis出错可以参考:https://blog.csdn.net/weixin_43719988/article/details/120698090
三、redis的基本使用 3.1 增删改查#添加 10.0.0.31:6379> set k1 v1 OK #查询 10.0.0.31:6379> get k1 "v1" #修改 10.0.0.31:6379> set k1 v2 OK 10.0.0.31:6379> get k1 "v2" #删除 10.0.0.31:6379> del k1 (integer) 1 10.0.0.31:6379> get k1 (nil) #判断存不存在 10.0.0.31:6379> EXISTS k1 (integer) 1 #查看类型 10.0.0.31:6379> TYPE k1 string #多个key进行操作 10.0.0.31:6379> MSET k1 v1 k2 v2 k3 v3 OK 10.0.0.31:6379> MGET k1 k2 k3 1) "v1" 2) "v2" 3) "v3"3.2 计时器
#Incr 命令将 key 中储存的数字值增一。 #如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。 10.0.0.31:6379> set k1 1 OK 10.0.0.31:6379> INCR k1 (integer) 2 10.0.0.31:6379> INCR k1 (integer) 3 10.0.0.31:6379> INCR k1 (integer) 4 10.0.0.31:6379> get k1 "4" #如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。 10.0.0.31:6379> incrby k1 10 (integer) 14 10.0.0.31:6379> get k1 "14"3.3 过期时间
-1 永不过期
-2 没有这个key
#设置过期时间 10.0.0.31:6379> EXPIRE k1 10 (integer) 0 10.0.0.31:6379> TTL k2 (integer) -2 #取消过期时间 10.0.0.31:6379> PERSIST k2 (integer) 03.4 列表
#添加列表元素 10.0.0.31:6379> RPUSH list1 1 (integer) 1 10.0.0.31:6379> RPUSH list1 A (integer) 2 #查看列表长度 10.0.0.31:6379> LLEN list1 (integer) 2 #查看列表元素 10.0.0.31:6379> LRANGE list1 0 -1 1) "1" 2) "A" #删除列表元素 10.0.0.31:6379> LRANGE list1 0 -1 1) "1" 2) "A" 3) "3" 4) "4" 5) "5" 6) "6" #从右边开始删除一个元素 10.0.0.31:6379> RPOP list1 "6" #从左边开始删除一个元素 10.0.0.31:6379> LPOP list1 "1" 10.0.0.31:6379> LRANGE list1 0 -1 1) "A" 2) "3" 3) "4" 4) "5"3.5 哈希
#添加 10.0.0.31:6379> HMSET user:1000 name zhangya age 28 job it OK #查询 10.0.0.31:6379> HMGET user:1000 name age job 1) "zhangya" 2) "28" 3) "it" 10.0.0.31:6379> HGETALL user:1000 1) "name" 2) "zhangya" 3) "age" 4) "28" 5) "job" 6) "it"3.6 集合(和list不同,set集合不允许出现重复值)
#添加 10.0.0.31:6379> SADD set1 1 2 3 4 5 (integer) 5 10.0.0.31:6379> SADD set2 3 4 2 10 (integer) 4 #查询 10.0.0.31:6379> SMEMBERS set1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 10.0.0.31:6379> SMEMBERS set2 1) "2" 2) "3" 3) "4" 4) "10" #SDIFF计算集合的差异成员 10.0.0.31:6379> SDIFF set1 set2 1) "1" 2) "5" #SINTER计算集合的交集 10.0.0.31:6379> SINTER set1 set2 1) "2" 2) "3" 3) "4" #SUNIOn计算集合的合并集 10.0.0.31:6379> SUNIOn set1 set2 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "10"
欢迎大家提出问题,一起交流



