Redis 数据库
Redis是一种键值型的NoSQL数据库,这里有两个关键字
- 键值型: 键值型是指Redis中存储的数据都是以Key-Value键值对的形式存储
- NoSQL: NoSql可以翻译做Not Only Sql(不仅仅是SQL),或者是No Sql(非Sql的)数据库。也称之为非关系型数据库。
Redis官网:https://redis.io/
图形化桌面客户端 安装包:https://github.com/lework/RedisDesktopManager-Windows/releases
安装:
- Windows 版:https://github.com/microsoftarchive/redis/releases
- Linux 版:https://download.redis.io/releases/
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5中常用的数据类型
- 字符串:String
- 哈希:Hash
- 列表:List
- 集合:Set
- 有序集合:Sorted Set
### Linux安装Redis
yum install redis
## 编译安装
tar -zxvf redisVersion.tar.gz -C /usr/local
## 安装依赖环境
yum install gcc-c++
## 进入到根目录
cd /usr/local/redis根目录
## 编译
make
## 进入到src目录
cd /usr/local/redis根目录/src
## 进行安装
make install
## 进入到根目录
cd /usr/local/redis根目录/src
## 执行redis-server
./redis-server
## Linux设置后台运行
## 进入到redis根目录下
cd /usr/local/redis根目录
## 修改配置文件
vim redis.conf
# 找到daemonize on字段,将其修改为daemonize yes
# 在redis根目录以redis.conf作为配置文件在后台运行
## Linux开启密码校验
# 修改redis.conf配置文件,找到requirepass这行,将其注释去掉,并在后面写上自己的密码
## 重新启动
src/redis-server ./redis.conf
## 登录时同时进行认证
src/redis-cli -h localhost -p 6379 -a 密码
### Linux开启远程连接
# 修改redis.conf配置文件,找到bind 127.0.0.1这行,把这行注释掉
## 开启6379端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent
## 设置立即生效
firewall-cmd --reload
## 查看开放的端口
firewall-cmd --zone=public --list-ports
字符串(String)常用命令
# 字符串(String)常用命令
命令 描述
SET key value 设置指定key的值
GET key 获取指定key的值
SETEX key seconds value 设置指定key的值,并将key的过期时间设为seconds秒
SETNX key value 只有在key不存在时设置key的值
哈希(Hash)常用命令
# 哈希(Hash)常用命令
# Redis Hash是一个String类型的Field和Value的映射表,Hash特别适合用于存储对象
命令 描述
HSET key field value 将哈希表key 中的字段field的值设为value
HGET key field 获取存储在哈希表中指定字段的值
HDEL key field 删除存储在哈希表中的指定字段
HKEYS key 获取哈希表中所有字段
HVALS key 获取哈希表中所有值
HGETALL key 获取在哈希表中指定key的所有字段和值
列表(List)常用命令
# 列表(List)常用命令
# Redis List是简单的字符串列表,按照插入顺序排序
命令 描述
LPUSH key value1 [value2] 将一个或多个值插入到列表头部
LRANGE key start stop 获取列表指定范围内的元素
RPOP key 移除并获取列表最后一个元素
LLEN key 获取列表长度
BRPOP key1 [key2] timeout 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
集合(Set)常用命令
# 集合(Set)常用命令
# Redis set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据
命令 描述
SADD key member1 [member2] 向集合添加一个或多个成员
SMEMBERS key 返回集合中的所有成员
SCARD key 获取集合的成员数
SINTER key1 [key2] 返回给定所有集合的交集
SUNION key1 [key2] 返回所有给定集合的并集
SDIFF key1 [key2] 返回给定所有集合的差集
SREM key member1 [member2] 移除集合中一个或多个成员
有序集合(Sorted Set)常用命令
# 有序集合(Sorted Set)常用命令
# Redis Sorted Set有序集合是String类型元素的集合,且不允许重复的成员。
# 每个元素都会关联一个double类型的分数(score) 。Redis正是通过分数来为集合中的成员进行从小到大排序。有序集合的成员是唯一的,但分数却可以重复。
命令 描述
ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量increment
ZREM key member [member …] 移除有序集合中的一个或多个成员
ZSCAN key 0 a
通用命令
# 通用命令
命令 描述
KEYs pattern 查找所有符合给定模式(pattern)的key
EXISTs key 检查给定key是否存在
TYPE key 返回key所储存的值的类型
TTL key 返回给定key的剩余生存时间(TTL, time to live),以秒为单位
DEL key 该命令用于在key存在是删除key
SCAN 用于遍历当前数据库中的键。
SSCAN 用于遍历集合键中的元素。
HSCAN 用于遍历哈希键中的键值对。
ZSCAN 用于遍历有序集合中的元素(包括元素成员和元素分值)。
SCAN cursor [MATCH pattern] [COUNT count]
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10
Redis 发布订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
# 第一个 redis-cli 客户端
redis 127.0.0.1:6379> SUBSCRIBE runoobChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "runoobChat"
3) (integer) 1
# 第二个 redis-cli 客户端
redis 127.0.0.1:6379> PUBLISH runoobChat "Redis PUBLISH test"
(integer) 1
redis 127.0.0.1:6379> PUBLISH runoobChat "Learn redis by runoob.com"
(integer) 1
# 订阅者的客户端会显示如下消息
1) "message"
2) "runoobChat"
3) "Redis PUBLISH test"
1) "message"
2) "runoobChat"
3) "Learn redis by runoob.com"
# Redis 发布订阅命令
序号 命令及描述
1 PSUBSCRIBE pattern [pattern ...] 订阅一个或多个符合给定模式的频道。
2 PUBSUB subcommand [argument [argument ...]] 查看订阅与发布系统状态。
3 PUBLISH channel message 将信息发送到指定的频道。
4 PUNSUBSCRIBE [pattern [pattern ...]] 退订所有给定模式的频道。
5 SUBSCRIBE channel [channel ...] 订阅给定的一个或多个频道的信息。
6 UNSUBSCRIBE [channel [channel ...]] 指退订给定的频道。
redis存值分目录层级
目录层级的设计是将Redis中的键值存储按照一定的规则划分到不同的目录中。通过这种方式,我们可以将数据进行分类和分组,提高数据的管理效率和访问性能。
目录层级的设计有以下几个优势:
- 分类和分组:目录层级可以将存储的数据进行分类和分组,提高数据的管理效率。
- 减少冲突:使用哈希函数可以将键值进行映射,减少键冲突的可能性。
- 提高访问性能:目录层级可以让数据在内存中更加分散,提高访问性能。
# 目录层级的规则可以根据实际需求来设计,以下是一些建议的规则:
# 1、使用哈希函数:可以使用哈希函数将键值进行映射,然后根据映射后的值来确定存储的目录。
def hash_func(key):
# 哈希函数的实现
pass
# 2、使用固定长度的目录名:可以将哈希值进行取模运算,然后将取模的结果作为目录的名称。
def get_directory_name(key):
hash_value = hash_func(key)
directory_name = str(hash_value % 1000)
return directory_name
# 3、使用多级目录:可以根据哈希值的不同部分来划分多级目录。例如,可以将哈希值的前两个字符作为一级目录,将后两个字符作为二级目录。
def get_directory_name(key):
hash_value = hash_func(key)
directory_name = str(hash_value)[:2] + '/' + str(hash_value)[2:]
return directory_name
Redis 四种序列化方式
Redis是一种基于内存的高性能键值数据库,它支持多种数据结构和功能。在Redis中,数据可以以多种不同的序列化方式进行存储和传输。本文将介绍Redis的四种序列化方式,并通过代码示例来详细说明它们的使用。
Redis的四种序列化方式分别为:字符串序列化、JSON序列化、MessagePack序列化和Protobuf序列化。
字符串序列化
字符串序列化是Redis默认的序列化方式,它将数据以字符串的形式进行存储和传输。在Redis中,可以使用SET命令将字符串类型的数据存储到数据库中,使用GET命令获取数据。示例代码如下:
SET key value
GET key
JSON序列化
JSON序列化是一种常见的数据序列化方式,它将数据转换为JSON格式的字符串进行存储和传输。在Redis中,可以使用SET命令将JSON格式的数据存储到数据库中,使用GET命令获取数据。示例代码如下:
SET key '{"name":"Alice","age":20}'
GET key
MessagePack序列化
MessagePack是一种高效的二进制数据序列化格式,它可以将数据转换为二进制格式进行存储和传输。在Redis中,可以使用SET命令将MessagePack格式的数据存储到数据库中,使用GET命令获取数据。示例代码如下:
SET key (MessagePack binary value)
GET key
Protobuf序列化
Protobuf是Google开发的一种高效的二进制数据序列化协议,它可以将数据转换为二进制格式进行存储和传输。在Redis中,可以使用SET命令将Protobuf格式的数据存储到数据库中,使用GET命令获取数据。示例代码如下:
SET key (Protobuf binary value)
GET key
以上是Redis的四种序列化方式的简单介绍和示例代码。不同的序列化方式适用于不同的场景和需求。字符串序列化简单易用,适合存储和传输简单的数据;JSON序列化可以方便地处理复杂的数据结构,但会增加存储和传输的大小;MessagePack和Protobuf序列化可以高效地存储和传输大量数据,但需要使用对应的库进行编解码。
在实际使用中,需要根据具体的需求和场景选择合适的序列化方式。通过合理选择序列化方式,可以提高数据的存储效率和传输性能,从而提升系统的整体性能。
redis序列化 反序列化
在Redis中,对于复杂的数据类型(如对象),我们需要将其序列化成字符串存储到Redis中,同时在取出时需要将字符串反序列化成原始的数据类型。
在Python中,我们可以使用json模块来实现序列化和反序列化。
例如,我们有一个Python对象,我们需要将其存储到Redis中,然后再取出来。
import json
import redis
class User:
def __init__(self, name, age):
self.name = name
self.age = age
# 实例化一个User对象
user = User('Tom', 20)
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 序列化:将User对象转换为字符串
user_json = json.dumps(user.__dict__)
# 存储到Redis
r.set('user', user_json)
# 从Redis取出
user_json = r.get('user')
# 反序列化:将字符串转换回User对象
user_dict = json.loads(user_json)
user = User(user_dict['name'], user_dict['age'])
print(user.name, user.age)
import pickle
import redis
class User:
def __init__(self, name, age):
self.name = name
self.age = age
# 实例化一个User对象
user = User('Tom', 20)
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 序列化:将User对象转换为字符串
user_pickle = pickle.dumps(user)
# 存储到Redis
r.set('user', user_pickle)
# 从Redis取出
user_pickle = r.get('user')
# 反序列化:将字符串转换回User对象
user = pickle.loads(user_pickle)
print(user.name, user.age)