Redis
Redis,python,缓存,非关系型DB
Redis实战
一、安装和启动
参考菜鸟教程
https://www.runoob.com/redis/redis-install.html
https://www.runoob.com/w3cnote/python-redis-intro.html
(一)Windows
1. 下载
redis本没有windows的,后微软官方开发了win版的redis,并放到了github上。
微软官方制作的redis下载地址:https://github.com/tporadowski/redis/releases
打开后,选择适合自己的版本,下载zip包即可,如:
2. 安装和配置
将下载的zip包放到自定义的目录下直接解压即可,如:D:\Program Files\Redis
- 环境变量配置
将D:\Program Files\Redis
添加到系统变量
3. 启动和操作
1)简洁命令
(1)启动
win+r输入cmd
打开cmd命令窗口,由于之前已经添加了环境变量,直接输入
redis-server
注:这种方式启动 redis 使用的是默认配置redis.windows.conf
(2)操作redis
再打开一个cmd命令窗口,输入
redis-cli
注释:操作命令类似 centos下的mysqld、 Ubuntu下的mysql
这时,可以里面操作redis了。
例:
存:
set myKey1 abc
取:
get myKey1
删:
del myKey1
2)详细命令
(1)打开cmd命令窗口,
cd D:/Program Files/Redis/
(如果没将 D:/Program Files/Redis/
添加到系统变量。)
redis-server.exe redis.windows.conf
注:以redis.windows.conf配置方式启动 redis,我们可以根据需要使用自己的配置文件
(2)操作redis
再打开一个cmd命令窗口,输入
redis-cli.exe -h 127.0.0.1 -p 6379
注释:操作命令类似 centos下的mysqld、 Ubuntu下的mysql
(二)Linux
1. 下载
官方:http://redis.io/download,如下载6.0.8版本的;
或者wget命令下载
$ wget http://download.redis.io/releases/redis-6.0.8.tar.gz
2. 安装、启动、操作
注意!下面的编译过程要保证有gcc,没有可以输入sudo apt install gcc
来安装。
# 安装编译。
$ tar xzf redis-6.0.8.tar.gz
$ cd redis-6.0.8
$ make
#编译后redis-6.0.8的src目录下会出现编译后的 redis 服务程序 redis-server,还有用于测试的客户端程序 redis-cli
# 启动1(以默认配置启动)
$ cd src
$ ./redis-server
# 启动2(以指定的redis.conf 文件配置启动)
$ cd src
$ ./redis-server ../redis.conf
# 操作(使用测试客户端程序 redis-cli 和 redis 服务交互)
$ cd src
$ ./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
附:Ubuntu下的apt安装方法
Ubuntu也可以采用apt在线安装
$ sudo apt update
$ sudo apt install redis-server
$ redis-server
$ redis-cli
redis 127.0.0.1:6379> ping
PONG
3. 其他配置
vim /redis/redis.conf
daemonize yes # 开启守护进程
# bind ip地址 # 远程
port 6379 # 端口号
db filename dump.rdb # 数据文件
1)开启守护进程
即:终端启动redis后,不再以终端运行,而是以后台服务运行的方式。
好处:不必单独开启redis运行终端,关闭终端仍然可以运行redis。
将 daemonize no
改成 daemonize yes
,如下图:
2)绑定ip
如果需要远程访问,则可绑定(bind)上本机redis的ip:
3)端口号
默认 6379,非必要不建议更改。
port 6379
二、使用操作
在python中使用redis,需要先用pip install redis
安装好redis接口包。
python代码:
import redis
import time
# # 法1:init
# r = redis.StrictRedis(host='127.0.0.1', port=6379, db=0)
# 法2:连接池(推荐)
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
# # 存
# r.set('foo', 'bar')
# # 取
# res = r.get('foo') # 等价 res = r['foo']
#
# print(res) # b'bar'
# print(type(res)) # <class 'bytes'>
#
#
# """
# 1.1 [过期s] setex(name, time, value)
# ex - 过期时间(秒) 这里过期时间是3秒,3秒后p,键food的值就变成None
# """
# print('例子1.1:')
# r.set('food', 'mutton', ex=3) # 等价 r.setex('food', 3, 'mutton')
# print(r.get('food'))
# time.sleep(2)
# print(r.get('food'))
# time.sleep(1)
# print(r.get('food'))
#
#
# """
# 1.2 [过期ms] psetex(name, time_ms, value)
# px - 过期时间(豪秒) 这里过期时间是3豪秒,3毫秒后,键foo的值就变成None
# """
# print('例子1.2:')
# r.set('food', 'beef', px=3) # 等价 r.psetex("fruit3", 3, "apple")
# print(r.get('food'))
# print(r.get('food'))
# time.sleep(0.003)
# print(r.get('food'))
#
#
# """
# 1.3 [插入INSERT] setnx(key, value)
# nx = True (保证新建--insert)。保证键唯一,出现重复key时value不覆盖。
# 如果设置为True,则key存在时不执行。即只有key不存在时,当前set操作才执行 (新建)
# 如果设置为False,则该功能开关关闭,请忽略此参数
# """
# print('例子1.3:')
# r.set('food', 'water')
# print(r.get('food'))
# r.set('food', 'watermelon', nx=True) # 等价 r.setnx('food', 'watermelon', nx=True)
# print(r.get('food'))
# r.set('food', 'watermelon')
# print(r.get('food'))
#
# """
# 1.4 xx = True(保证更新--update)
# 如果设置为True,则只有key存在时,当前set操作才执行(修改)
# 如果设置为False,则该功能开关关闭,请忽略此参数
# """
# print('例子1.4:')
# r.set('fru', 'wat', xx=True)
# print(r.get('fru'))
# r.set('fruit', 'water')
# print(r.get('fruit'))
# r.set('fruit', 'watermelon', xx=True)
# print(r.get('fruit'))
"""
二、批量操作
m = many 批量
"""
"""
2.1 批量设置值mset()和取值mget()
"""
# mset中 m=many 批量
r.mset({
"k1":"v1",
"k2":"v2",
'k3':'v3'
})
r.mget({
'k1':'v1',
'k2':'v2',
'k3':'v3'
})
print(r.mget("k1", "k2", "k3")) # 结果:['v1', 'v2', 'v3']
# 等价下面
print(r.mget(["k1", "k2", "k3"])) # 结果:['v1', 'v2', 'v3']
"""
2.2 取出redis所有key
"""
# 法1 [推荐] r.scan()
# 一次读取2000
keys_tuple = r.scan(cursor=0, count=1000)
print(keys_tuple)
keys = keys_tuple[1]
print(keys) # 结果如:['k2', 'w2ckey', 'k3', 'food', 'foo', 'w3ckey', 'fruit', 'ff', 'k1']
# 法2 [十分不建议用!数据量大时容易使redis集群崩溃] r.keys()
keys = r.keys()
print(keys)
3. 应用场景
应用场景 – 页面点击数。---- 使用 incr()
假定我们对一系列页面需要记录点击次数。例如论坛的每个帖子都要记录点击次数,而点击次数比回帖的次数的多得多。如果使用关系数据库来存储点击,可能存在大量的行级锁争用。所以,点击数的增加使用redis的INCR命令最好不过了。
当redis服务器启动时,可以从关系数据库读入点击数的初始值(12306这个页面被访问了34634次)
r.set("visit:12306:totals", 34634) # 键visit:12306:totals ----> 值34634
print(r.get("visit:12306:totals"))
每当有一个页面点击,则使用INCR增加点击数即可。
r.incr("visit:12306:totals") # incr == increase增加
r.incr("visit:12306:totals")
页面载入的时候则可直接获取这个值
print(r.get("visit:12306:totals"))