目录
- 一、简介
- 1.1 nosql介绍
- 1.2 redis特性
- 1.3 redis优势
- 1.4 redis应用场景
- 二、安装
- 2.1 Macos下安装
- 2.2 Linux下安装
- 2.4 客户端连接
- 2.5 切换数据库
- 三、数据库操作
- 3.1 string类型
- 3.2 键的操作
- 3.3 Hash类型
- 3.4 list类型
- 3.5 set类型
- 3.6 zset类型
- 四、和python交互
- 4.1 安装redis包
- 4.2 string方法操作
- 4.3 在django使用redis
一、简介
- Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
- Redis是 NoSQL技术阵营中的一员,它通过多种键值数据类型来适应不同场景下的存储需求,借助一些高层级的接口使用其可以胜任,如缓存、队列系统的不同角色
- 官网介绍
1.1 nosql介绍
一类新出现的数据库(not only sql),它的特点有:
- 不支持SQL语法
- 不支持事务
- 存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式
- NoSQL的世界中没有一种通用的语言,每种nosql数据库都有自己的api和语法,以及擅长的业务场景
- NoSQL中的产品种类相当多:
- Mongodb
- Redis
- Hbase hadoop
- Cassandra hadoop
1.2 redis特性
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
1.3 redis优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
1.4 redis应用场景
- 用来做缓存(ehcache/memcached)——redis的所有数据是放在内存中的(内存数据库)
- 可以在某些特定应用场景下替代传统数据库——比如社交类的应用
- 在一些大型系统中,巧妙地实现一些特定的功能:session共享、购物车
二、安装
2.1 Macos下安装
(1) 通过brew去安装
brew install redis
安装路径位于
/opt/homebrew/opt/redis
(2) 在前台启动和停止 Redis
要测试 Redis 安装,可以运行下面命令:
redis-server
如果成功,您将看到 Redis 的启动日志,Redis 将在前台运行。
可以看到这种启动方式, 终端会一直工作, 要停止 Redis,输入 Ctrl-C 。
(3) 在后台启动和停止 Redis
通过 launchd 后台启动, 命令如下:
brew services start redis
这将启动 Redis 并在登录时重新启动它。您可以通过运行以下命令来检查 launchd 托管 Redis 的状态:
brew services info redis
要停止该服务,运行如下命令:
brew services stop redis
2.2 Linux下安装
(1) 下载源文件
wget https://download.redis.io/redis-stable.tar.gz
(2) 解压/复制
tar -zxvf redis-stable.tar.gz
sudo mv ./redis-stable /usr/local/redis/
(3) 编译安装
cd /usr/local/redis/
sudo make
sudo make test
sudo make install
(4) 查看安装文件
cd /usr/local/bin
ls -all
- redis-server: redis服务器
- redis-cli: redis命令行客户端
- redis-benchmark: redis性能测试工具
- redis-check-aof: AOF文件修复工具
- redis-check-rdb: RDB文件检索工具
(5) 移动配置文件
sudo cp /usr/local/redis/redis.conf /etc/redis/
2.3 个性化配置
Macos的配置文件位于:
/opt/homebrew/etc/redis.conf
Linux的配置文件位于:
/etc/redis/redis.conf
(1) 绑定ip
如果需要远程访问,可将此⾏注释,或绑定⼀个真实ip, 默认是配置了本机地址
(2) 端⼝,默认为6379
(3) 是否以守护进程运⾏
- 如果以守护进程运⾏,则不会在命令⾏阻塞,类似于服务
- 如果以⾮守护进程运⾏,则当前终端被阻塞
- 设置为yes表示守护进程,设置为no表示⾮守护进程
- 推荐设置为yes
(4) 数据库文件
(5) 数据⽂件存储路径
(6) 配置日志文件
需要提前创建目录和文件
(7) 默认数据库的个数
2.4 客户端连接
客户端连接的命令为
redis-cli
通过–help可以查看帮助选项
连接本机可以不需要指定-h和-p, 连接本机成功展示如下:
此时输入ping会返回pong
2.5 切换数据库
数据库没有名称,默认有16个,通过0-15来标识,连接redis默认选择第一个数据库
通过select n可以切换数据库, 其中n为0~15, 如下所示:
三、数据库操作
Redis支持以下5种主要的数据类型:
- 字符串(String):最基本的数据类型,可以存储字符串、整数或浮点数。
- 列表(List):有序的字符串列表,可以在列表的头部或尾部进行元素的插入、删除和获取。
- 哈希(Hash):键值对的集合,适合存储对象的属性和值。
- 集合(Set):无序的字符串集合,不允许重复的元素。
- 有序集合(Sorted Set):类似于集合,每个元素都关联一个分数,可以根据分数进行排序,并且每个元素的分数必须是唯一的。
3.1 string类型
字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
(1) 保存值
如果设置的键不存在则为添加,如果设置的键已经存在则修改
set key value
例如:
(2) 设置键值及过期时间,以秒为单位
setex key second value
例如:
(3) 设置多个键值
mset key1 value1 [key2 value2 …]
(4) 追加值
append key value
(5) 获取单个值
get key
(6) 根据多个键获取多个值
mget key1 key2 ...
3.2 键的操作
(1) 搜索键, 支持正则表达式
keys pattern
通配符*表示所有.
(2) 判断键是否存在
exists key1
存在返回1, 不存在返回0
(3) 查看键对应的value的类型
type key
(4) 删除键
del key1 key2 ...
(5) 设置过期时间,以秒为单位
expire key seconds
返回结果 (integer) 1 表示命令执行成功,且设置过期时间成功。
(6) 查看有效时间,以秒为单位
ttl key
返回结果 (integer) -2 表示该键不存在或已过期。具体含义如下:
- -1 表示键存在但没有设置过期时间。
- -2 表示键不存在或已过期。
- 其他正整数表示键的剩余生存时间(以秒为单位)。
过期后, 这个键值对会删除掉.
3.3 Hash类型
- hash⽤于存储对象,对象的结构为属性、值
- 值的类型为string
(1) 增加、修改
设置单个属性
hset key field value [field value...]
(2) 获取指定键所有的属性名
hkeys key
(3) 获取⼀个属性的值
hget key field
(4) 获取多个属性的值
hmget key field [field...]
(5) 获取所有属性的值
hvals key
(6) 删除操作
删除整个hash键及值,使⽤del命令
删除属性,属性对应的值会被⼀起删除
hdel key field1 field2 ...
3.4 list类型
- 列表的元素类型为string
- 按照插⼊顺序排序
(1) 添加
在左侧插⼊数据
lpush key value1 value2 ...
在右侧插⼊数据
rpush key value1 value2 ...
(2) 在指定元素的前或后插⼊新元素
linsert key before或after 现有元素 新元素
(3) 获取元素
返回列表⾥指定范围内的元素
lrarge key start stop
- start、stop为元素的下标索引
- 索引从左侧开始,第⼀个元素为0
- 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
(4) 设置指定索引位置的元素值
lset key index value - 索引从左侧开始,第⼀个元素为0
- 索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素
(5) 删除指定元素
lrem key count value - 将列表中前count次出现的值为value的元素移除
- count > 0: 从头往尾移除
- count < 0: 从尾往头移除
- count = 0: 移除所有
3.5 set类型
- ⽆序集合
- 元素为string类型
- 元素具有唯⼀性,不重复
- 说明:对于集合没有修改操作
(1) 添加元素
sadd key member1 member2 ...
(2) 获取所有元素
smembers key
(3) 删除指定元素
srem key member [member...]
3.6 zset类型
- sorted set,有序集合
- 元素为string类型
- 元素具有唯⼀性,不重复
- 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
- 没有修改操作
(1) 增加
zadd key score1 member1 score2 member2 ..
例如向键’a4’的集合中添加元素’lisi’、‘wangwu’、‘zhaoliu’、‘zhangsan’,权重(score)分别为4、5、6、3
(2) 获取
zrange key start stop
- 返回指定范围内的元素
- start、stop为元素的下标索引
- 索引从左侧开始,第⼀个元素为0
- 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
(3) 返回score值在min和max之间的成员
zrangebyscore key min max
(4) 返回成员member的score值
(5) 删除
zrem key member1 member2 ...
删除集合’a4’中元素’zhangsan’
删除权重在指定范围的元素
zremrangebyscore key minindex maxindex
四、和python交互
4.1 安装redis包
进入虚拟环境中安装
mkvirtualenv -p python3 redis_study
workon redis_study
pip install redis
使用pycharm创建项目
创建StrictRedis对象
from redis import *
if __name__ == "__main__":
try:
# 创建StrictRedis对象,与redis服务器建⽴连接
# 通过init创建对象,指定参数host、port与指定的服务器和端⼝连接,host默认为localhost,port默认为6379,db默认为0
sr = StrictRedis(host='localhost', port=6379, db=0)
# 简写
# sr=StrictRedis()
except Exception as e:
print(e)
根据不同的类型,拥有不同的实例⽅法可以调⽤,与前⾯学的redis命令对应,⽅法需要的参数与命令的参数⼀致
4.2 string方法操作
(1) set操作
⽅法set,添加键、值,如果添加成功则返回True,如果添加失败则返回False
注意: Redis中存储的数据都是二进制的,所以存储的对象都是字节串, 字节串前是有一个b来区分的
if __name__ == "__main__":
try:
sr = StrictRedis()
result = sr.set('name', '张三2')
# 输出响应结果,如果添加成功则返回True,否则返回False
print(result)
except Exception as e:
print(e)
(2) string获取
⽅法get,添加键对应的值,如果键存在则返回对应的值,如果键不存在则返回None
if __name__ == "__main__":
try:
sr = StrictRedis()
# 获取键name的值
result = sr.get('name')
# 有中文的话需要解码
decoded_result = result.decode('utf-8')
print(result)
print(decoded_result)
except Exception as e:
print(e)
输出结果:
b'\xe5\xbc\xa0\xe4\xb8\x892'
张三2
(3) string修改
⽅法set,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
from redis import *
if __name__ == "__main__":
try:
sr = StrictRedis()
# 获取键name的值
sr.set('name', 'zhangsan')
result = sr.get('name').decode('utf-8')
print(f"修改前{result}")
sr.set('name', 'lisi')
result = sr.get('name').decode('utf-8')
print(f"修改后{result}")
except Exception as e:
print(e)
输出结果:
修改前zhangsan
修改后lisi
(4) string删除
⽅法delete,删除键及对应的值,如果删除成功则返回受影响的键数,否则则返 回0
from redis import *
if __name__ == "__main__":
try:
sr = StrictRedis()
# 获取键name的值
sr.set('name', 'zhangsan')
sr.delete('name')
result = sr.get('name')
print(f"删除后{result}")
except Exception as e:
print(e)
结果:
删除后None
(5) 获取键
⽅法keys,根据正则表达式获取键
from redis import *
if __name__ == "__main__":
try:
sr = StrictRedis()
# 获取所有的键
result = sr.keys()
# 输出响应结果,所有的键构成⼀个列表,如果没有键则返回空列表
print(result)
except Exception as e:
print(e)
输出结果:
[b'hobby', b'user', b'arr1']
4.3 在django使用redis
之前django的session默认是存在的数据库里面的,我们也可以把session存储在redis里面
(1) 创建django项目
workon redis_study
pip install django
pip install redis
cd workspace/python/redis_study
django-admin startproject session_test
(2) 修改settings文件,增加如下项
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS = {
'host': 'localhost',
'port': 6379,
'db': 2, # 选择3个数据库
'password': '',
'prefix': 'session',
'socket_timeout': 1
}
SESSION_COOKIE_AGE = 3600 # Session过期时间,单位为秒
其中,SESSION_ENGINE指定使用redis_sessions.session作为Session存储引擎。
SESSION_REDIS指定了Redis的连接配置,其中包括主机、端口、数据库、密码等信息。prefix参数指定了存储在Redis中的Session键的前缀,可以根据需要自行设置。
SESSION_COOKIE_AGE指定了Session的过期时间,单位为秒。具体的配置可以根据实际需求进行调整。
(3) 添加应用
cd session_test
python manage.py startapp booktest
(4) 修改setting文件添加booktest和redis应用
INSTALLED_APPS = [
...
'booktest',
'redis'
]
(5) 配置项目的url文件
将booktest应用的url配置加到映射中
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# 添加映射, 将booktest/路径 和 booktest.urls.py进行关联
path('booktest/', include('booktest.urls')),
]
(6) 测试
打开booktest/views.py文件,创建session_set和session_get视图如下
from django.http import HttpResponse
# 保存session
def session_set(request):
request.session['name'] = '张三'
return HttpResponse('ok')
# 获取session
def session_get(request):
name = request.session['name']
return HttpResponse(name)
添加booktest/urls.py文件,配置url如下
from django.contrib import admin
from django.urls import path, include
from booktest import views
urlpatterns = [
path('session_set/', views.session_set, name='session_set'),
path('session_get/', views.session_get, name='session_get'),
]
(7) 启动项目
python manage.py runserver
输入地址:http://127.0.0.1:8000/booktest/session_set/ 进行session存储
输入地址http://127.0.0.1:8000/booktest/session_get/ 获取session值
然后通过redis-cli客户端查看
查看对应的value
Base64在线解码https://base64.us/
其中\u5f20\u4e09对应的中文就是张三