Redis是一个开源的使用ANSI C语言编写的、支持网络、 基于内存的、支持持久化的日志型、Key-Value数据库。
Redis是开源的,我们可以从它的官网或 GitHub获取
Redis支持网络,是属于分布式缓存机制,可以通过网络实现主从同步
Redis 基于内存,Redis的数据全部缓存在内存中,从而保证其高效性能
Redis是一个Key-Value存储系统,是非关系型数据库
Redis安装
在官网上查看最新版本,复制其下载地址
wget http://download.redis.io/releases/redis-4.0.8.tar.gz
tar xzf redis-4.0.8.tar.gz
cd redis-4.0.8
make
1.进入src目录
cd src
2.启动redis
./redis-server
出现以下画面表示安装成功
修改配置文件
新开一个终端
进入到redis-4.0.8目录下
vim redis.conf
将其中的daemonize no 改为yes
保存并退出.
确认redis服务进程启动以后,使用redis-cli 与redis 服务交换了
[root@localhost src]# ./redis-cli
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
127.0.0.1:6379>
如果redis服务进程没有启动! 那么将会出现以下场景
[root@localhost src]# ./redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
Could not connect to Redis at 127.0.0.1:6379: Connection refused
此时应该退出redis-cli
not connected> exit
启动redis服务进程./redis-server再新开一个终端进入到src目录./redis-cli
(待补充)
1、启动Redis客户端
./redis-cli
2、检测Redis服务端是否启动 执行 PING 命令
[root@localhost src]# ./redis-cli
127.0.0.1:6379> ping
PONG
3、远程登录
redis-cli -h host -p port -a password
4、Key操作
命令 | 描述 | 实例 |
DEL | key存在时,删除key | DEL foo |
DUMP | 序列化给定的key, key 不存在,那么返回 nil ,否则返回被序列号的值 | DUMP foo |
EXISTS | 检查key是否存在 | EXISTS foo |
EXPIRE | 给key设置多少秒后被删除 | EXPIRE foo 600 (600秒后被删除) |
EXPIREAT | EXPIRE 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。 |
EXPIREAT foo 1293840000 |
PEXPIRE | 设置 key 的过期时间以毫秒计 | |
PEXPIREAT | 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 | |
KEYS | 查找所有符合给定模式的 key ,并以列表的形式返回 | |
MOVE | 将当前数据库的 key 移动到给定的数据库 | |
PERSIST | 移除 key 的过期时间,key 将持久保持 | |
PTTL | 以毫秒为单位返回 key 的剩余的过期时间 | |
TTL | 以秒为单位返回 key 的剩余的过期时间 | TTL foo |
RANDOMKEY | 从当前数据库中随机返回一个 key ,数据库为空返回 nil | RANDOMKEY |
RENAME | 修改 key 的名称 | RENAME foo too |
RENAMENX | 仅当 newkey 不存在时,将 key 改名为 newkey | |
TYPE | 返回 key 所储存的值的类型。 | TYPE foo (返回值string) |
SET | 插入key | SET foo |
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
---------------------------------------------------
redis Save 命令基本语法如下:
redis 127.0.0.1:6379> SAVE
OK
该命令将在 redis 安装目录中创建dump.rdb文件。
如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用 CONFIG 命令,如下所示:
127.0.0.1:6379> CONFIG GET dir
2) "/root/redis-4.0.8/src"
1) "dir"
创建 redis 备份文件也可以使用命令 BGSAVE,该命令在后台执行
127.0.0.1:6379> BGSAVE
Background saving started
我们可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证
默认情况下,无需通过密码验证就可以连接到redis服务中.我们可以通过
CONFIG get requirepass
查看是否设置了验证密码1.如果未设置验证密码:
127.0.0.1:6379>
1) "requirepass"
2) ""
如果设置了验证密码:
127.0.0.1:6379> CONFIG get requirepass
(error) NOAUTH Authentication required.
如果未设置验证密码,则通过以下命令创建验证密码为123456
CONFIG set requirepass "123456"
如果要连接数据库就需要验证密码,否则就报错
(error) NOAUTH Authentication required.
执行:
127.0.0.1:6379>AUTH “123456”
命令 |
描述 |
CLIENT LIST | 返回连接到 redis 服务的客户端列表 |
CLIENT SETNAME | 设置当前连接的名称 |
CLIENT GETNAME | 获取通过 CLIENT SETNAME 命令设置的服务名称 |
CLIENT PAUSE | 挂起客户端连接,指定挂起的时间以毫秒计 |
CLIENT KILL | 关闭客户端连接 |
服务端处理命令,并将结果返回给客户端。
Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应,从而显著提高 redis 服务的性能。
另外一种分区方法是hash分区。这对任何key都适用,也无需是object_name:这种形式,像下面描述的一样简单:
用一个hash函数将key转换为一个数字,比如使用crc32 hash函数。对key foobar执行crc32(foobar)会输出类似93024922的整数。对这个整数取模,将其转化为0-3之间的数字,就可以将这个整数映射到4个Redis实例中的一个了。93024922 % 4 = 2,就是说key foobar应该被存到R2实例中。注意:取模操作是取除的余数,通常在多种编程语言中用%操作符实现。
redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类
建立一个测试文件输入命令:
vim testredis.py
在新testredis.py中输入以下代码:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis
r = redis.Redis(host='127.0.0.1', port=6379,db=0,password="123456") # 登录用户信息如果没有设置密码就把password去掉,否则会报错
r.set('name', 'zhangsan') #添加zhangsan
print (r.get('name')) #获取获取zhangsan并打印在屏幕上
保存退出,执行python testredis.py返回结果如下
[root@localhost Redis]# python testredis.py
zhangsan
2、连接池
redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379,db=0,password="123456")# 登录用户信息如果没有设置密码就把password去掉,否则会报错
r = redis.Redis(connection_pool=pool)
r.set('name', 'lisi') #添加李四
print (r.get('name')) #获取
3、操作#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379,db=0,password="123456")# 登录用户信息如果没有设置密码就把password去掉,否则会报错
r = redis.Redis(connection_pool=pool)
pipe = r.pipeline(transaction=True)
r.set('name', 'zhangsan')
r.set('name', 'lisi')
pipe.execute()
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import redis
class RedisHelper(object):
def __init__(self):
self.__conn = redis.Redis(host='127.0.0.1', port=6379,db=0,password="123456")#连接Redis
self.channel = 'monitor' #定义频道
def publish(self,msg):#定义发布方法
self.__conn.publish(self.channel,msg)
return True
def subscribe(self):#定义订阅方法
pub = self.__conn.pubsub()
pub.subscribe(self.channel)
pub.parse_response()
return pub
发布者
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#发布
from RedisHelper import RedisHelper
obj = RedisHelper()
obj.publish('hello')#发布
订阅者
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from RedisHelper import RedisHelper
obj = RedisHelper()
redis_sub = obj.subscribe()#调用订阅方法
while True:
msg= redis_sub.parse_response()
print (msg)