redis
文章目录
1. redis简介
官方介绍:
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes with radius queries and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
翻译:
Redis
是一个开源(BSD许可
)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings
), 散列(hashes
), 列表(lists
), 集合(sets
), 有序集合(sorted sets
) 与范围查询, bitmaps
, hyperloglogs
和 地理空间(geospatial
) 索引半径查询。 Redis
内置了 复制(replication
),LUA脚本(Lua scripting
), LRU驱动事件(LRU eviction
),事务(transactions
) 和不同级别的 磁盘持久化(persistence
), 并通过 Redis哨兵(Sentinel
)和自动 分区(Cluster
)提供高可用性(high availability
)。
2. redis特性
- 速度快
- 基于键值对的数据结构服务器
- 丰富的功能:除了5种数据结构,Redis还提供了许多额外的功能
- 键过期功能,可以用来实现缓存
- 发布订阅功能,可以用来实现消息系统
- 支持Lua脚本功能,可以利用Lua创造出新的Redis命令
- 简单的事务功能,能在一定程度上保证事务特性
- 流水线(Pipeline)功能,这样客户端能将一批命令一次性传到Redis,减少了网络的开销
- 简单稳定
- 客户端语言多
- 持久化
- 主从复制
- 高可用和分布式
3. redis应用场景
- 缓存:加快数据的访问速度,降低后端数据源的压力
- 排行榜系统:按照热度排名的排行榜,按照发布时间的排行榜等各种排行榜系统
- 计数器应用:视频网站有播放数、电商网站有浏览数,保证了数据的实时性
- 社交网络:赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等
- 消息队列系统:Redis提供了发布订阅功能和阻塞队列的功能
4. redis数据类型
1.string类型
字符串类型是redis中最为基础的数据存储类型,它在redis中是二进制安全的,也就是byte类型
最大容量是512M。
key:string
2.hash类型
hash用于存储对象,对象的结构为属性、值,值的类型为string
key:{
域:值[这里的值只能是字符串].
域:值,
域:值,
...
}
3.list类型
列表的元素类型为string
key:[值1,值2,值3...]
4.set类型
无序集合,元素为string类型,元素唯一不重复,没有修改操作
key:{值1,值2,值3...}
5.zset类型
有序集合,元素为string类型,元素唯一不重复,有修改操作
key:{
值:权重值,
值:权重值,
}
5. redis安装
//安装依赖环境
[root@localhost ~]# yum -y install gcc gcc-c++
[root@localhost ~]# yum -y install centos-release-scl
[root@localhost ~]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
[root@localhost ~]# scl enable devtoolset-9 bash
//下载redis
[root@localhost ~]# wget http://download.redis.io/releases/redis-6.0.6.tar.gz
[root@localhost ~]# tar xf redis-6.0.6.tar.gz
//编译安装
[root@localhost ~]# cd redis-6.0.6/
[root@localhost redis-6.0.6]# make MALLOC=libc
[root@localhost redis-6.0.6]# cp src/{redis-server,redis-cli} /usr/bin/
[root@localhost redis-6.0.6]# cp redis.conf /etc/
//启动redis
[root@localhost ~]# redis-server
6. redis配置
//redis客户端登录和退出
[root@localhost ~]# redis-cli
127.0.0.1:6379>
127.0.0.1:6379> quit
//绑定IP,可以提供远程登录
[root@localhost ~]# vim /etc/redis.conf
...
bind 127.0.0.1 #最好bind 0.0.0.0
...
//设置默认端口号
[root@localhost ~]# vim /etc/redis.conf
...
port 6380
...
[root@localhost ~]# redis-server /etc/redis.conf
[root@localhost ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 127.0.0.1:6380 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 128 [::]:22 [::]:*
[root@localhost ~]# redis-cli -p 6380
127.0.0.1:6380>
//设置redis密码
[root@localhost ~]# vim /etc/redis.conf
...
# requirepass foobared
requirepass 12321 //设置密码
...
[root@localhost ~]# redis-cli
127.0.0.1:6379> set a 10
(error) NOAUTH Authentication required. //没有认证所以没有权限
127.0.0.1:6379> auth 12321 //密码认证
OK
127.0.0.1:6379> set a 10
OK
127.0.0.1:6379> get a
"10"
//将缓存存入硬盘(持久化)
[root@localhost ~]# vim /etc/redis.conf
...
save 900 1 //15分钟内有一个值变化就写入磁盘
save 300 10 //5分钟内有10个值变化就写入磁盘
save 60 10000 //1分钟内有10000个值变化就写入磁盘
...
//后台运行redis-server
[root@localhost ~]# nohup redis-server /etc/redis.conf &
7. redis命令
可以参考以下网站:
7.1 Redis 键:key
Redis 键命令用于管理 redis 的键。
语法:
redis 127.0.0.1:6379> COMMAND KEY_NAME
实例:
//SET key:设置key
127.0.0.1:6379> SET a 10
OK
127.0.0.1:6379> GET a
"10"
//DEL key:删除key
127.0.0.1:6379> DEL a
(integer) 1
//EXISTS key:检查给定key是否存在
127.0.0.1:6379> EXISTS a
(integer) 0
//TYPE key:返回key所储存的值的类型
127.0.0.1:6379> SET abc 'hello'
OK
127.0.0.1:6379> TYPE abc
string
7.2 Redis 字符串:String
Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下:
redis 127.0.0.1:6379> COMMAND KEY_NAME
实例:
//SET key value:设置指定key的值
# 对不存在的键进行设置
127.0.0.1:6379> SET key 'hello'
OK
127.0.0.1:6379> GET key
"hello"
# 对已存在的键进行设置
127.0.0.1:6379> SET key 'world'
OK
127.0.0.1:6379> GET key
"world"
//MGET key1 [key2..]:获取所有(一个或多个)给定key的值
127.0.0.1:6379> MGET abc key
1) "hello"
2) "world"
//SETNX key value:只有在key不存在时设置key的值
127.0.0.1:6379> EXISTS job # job 不存在
(integer) 0
127.0.0.1:6379> SETNX job 'test' # job 设置成功
(integer) 1
127.0.0.1:6379> SETNX job 'test1' # 尝试覆盖 job ,失败
(integer) 0
127.0.0.1:6379> GET job # 没有被覆盖
"test"
//INCR key:将key中储存的数字值增一
127.0.0.1:6379> GET a
"10"
127.0.0.1:6379> INCR a
(integer) 11
127.0.0.1:6379> GET a
"11"
7.3 Redis 哈希:Hash
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
实例:
//HMSET key field1 value1 [field2 value2 ]:同时将多个field-value(域-值)对设置到哈希表 key 中
127.0.0.1:6379> HMSET key name "redis tutorial" description "redis basic commands" likes 20 visitors 23000
//HGETALL key:获取在哈希表中指定key的所有字段和值
127.0.0.1:6379> HGETALL key
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands"
5) "likes"
6) "20"
7) "visitors"
8) "23000"
//HVALS key:获取哈希表中所有值
127.0.0.1:6379> HVALS key
1) "redis tutorial"
2) "redis basic commands"
3) "20"
4) "23000"
7.4 Redis 列表:List
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
实例:
//LPUSH key value1 [value2]:将一个或多个值插入到列表头部
127.0.0.1:6379> LPUSH list "tom" "jerry"
(integer) 2
//LRANGE key start stop:获取列表指定范围内的元素
127.0.0.1:6379> LRANGE list 0 2
1) "tom"
2) "jerry"
//LINSERT key BEFORE|AFTER pivot value:在列表的元素前或者后插入元素
127.0.0.1:6379> LINSERT list after "jerry" "jack"
(integer) 3
127.0.0.1:6379> LRANGE list 0 10
1) "tom"
2) "jerry"
3) "jack"
//LLEN key:获取列表长度
127.0.0.1:6379> LLEN list
(integer) 3
//LPOP key:移出并获取列表的第一个元素
127.0.0.1:6379> LPOP list
"tom"
127.0.0.1:6379> LRANGE list 0 10
1) "jerry"
2) "jack"
7.5 Redis 集合:Set
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
实例:
//SADD key member1 [member2]: 向集合添加一个或多个成员
127.0.0.1:6379> SADD myset "hello"
(integer) 1
127.0.0.1:6379> SADD myset "foo"
(integer) 1
//SCARD key:获取集合的成员数
127.0.0.1:6379> SCARD myset
(integer) 2
//SMEMBERS key:返回集合中的所有成员
127.0.0.1:6379> SMEMBERS myset
1) "foo"
2) "hello"