Redis缓存

Redis是什么?

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

Redis配置

(待补充)

Redis命令

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操作

命令描述实例
DELkey存在时,删除keyDEL 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 ,数据库为空返回 nilRANDOMKEY
RENAME修改 key 的名称RENAME foo too
RENAMENX仅当 newkey 不存在时,将 key 改名为 newkey  
TYPE返回 key 所储存的值的类型。TYPE foo  (返回值string)
SET插入keySET foo

Redis 数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)

  • String(字符串)
  • Hash(哈希)
  • List(列表)
  • Set(集合)
  • zset(sorted set:有序集合)

---------------------------------------------------

Redis数据备份与恢复

Redis 数据备份与恢复
Redis SAVE 命令用于创建当前数据库的备份。
语法

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"

以上命令 CONFIG GET dir 输出的 redis 安装目录为 /root/redis-4.0.8/src。
BGSAVE

创建 redis 备份文件也可以使用命令 BGSAVE,该命令在后台执行

127.0.0.1:6379> BGSAVE
Background saving started

Redis 安全

我们可以通过 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是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:
客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。

服务端处理命令,并将结果返回给客户端。

Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应,从而显著提高 redis 服务的性能。

Redis 分区

分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。

分区的优势:

通过利用多台计算机内存的和值,允许我们构造更大的数据库。
通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络带宽。

分区的不足:

redis的一些特性在分区方面表现的不是很好:
涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例上时,你就不能对这两个set执行交集操作。
涉及多个key的redis事务不能使用。
当使用分区时,数据处理较为复杂,比如你需要处理多个rdb/aof文件,并且从多个实例和主机备份持久化文件。
增加或删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性。然而,一种叫做presharding的技术对此是有帮助的。
分区类型
Redis 有两种类型分区。 假设有4个Redis实例 R0,R1,R2,R3,和类似user:1,user:2这样的表示用户的多个key,对既定的key有多种不同方式来选择这个key存放在哪个实例中。也就是说,有不同的系统来映射某个key到某个Redis服务。
范围分区
最简单的分区方式是按范围分区,就是映射一定范围的对象到特定的Redis实例。
比如,ID从0到10000的用户会保存到实例R0,ID从10001到 20000的用户会保存到R1,以此类推。
这种方式是可行的,并且在实际中使用,不足就是要有一个区间范围到实例的映射表。这个表要被管理,同时还需要各 种对象的映射表,通常对Redis来说并非是好的方法。
哈希分区

另外一种分区方法是hash分区。这对任何key都适用,也无需是object_name:这种形式,像下面描述的一样简单:

用一个hash函数将key转换为一个数字,比如使用crc32 hash函数。对key foobar执行crc32(foobar)会输出类似93024922的整数。对这个整数取模,将其转化为0-3之间的数字,就可以将这个整数映射到4个Redis实例中的一个了。93024922 % 4 = 2,就是说key foobar应该被存到R2实例中。注意:取模操作是取除的余数,通常在多种编程语言中用%操作符实现。

python操作redis

1、连接方式

  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、操作
 redis详细操作命令 
4、管道
  redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作

#!/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()


5、发布和订阅
首先定义一个RedisHelper类,连接Redis,定义频道为monitor,定义发布(publish)及订阅(subscribe)方法。

#!/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)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值