数据库基础总结《三》Redis

Redis简介

Remote Dlctionary Server(Redis)是一个key-value存储系统。
Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis与其他key-value缓存产品有以下三个特点:

  1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  2. Redis不仅仅支持简单的key-value类型的数据,同时换提供List,set,zset,hash登数据结构的存储。
  3. Redis支持数据的备份,即master-slave模式的数据备份。

Windows下的安装

数据库基础总结《三》Redis_第1张图片

数据库基础总结《三》Redis_第2张图片

启动:redis-server *.conf
启动:redis-cli

 Ubuntu环境下安装Redis

sudo apt-get install redis-server
停止服务:service redis stop
启动服务:service redis start
启动服务端:redis-server
启动客户端:redis-cli

 Redis配置

以指定配置文件启动服务端
redis-server "c:\Program Files\Redis\redis.conf

获取所有配置信息
config get *

获取单项配置信息
config get loglevel config get dbfilename

设置单项配置信息
config set loglevel warning
config set....

配置项目说明

#设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
databases 16
#绑定的主机地址
bind 127.0.0.1
#绑定的主机端口
port 6379
#指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save 
#Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
#分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。


#指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb

#指定本地数据库存放目录
dir ./

#设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供密码,默认关闭
requirepass foobared

#设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof 

#当master服务设置了密码保护时,slav服务连接master的密码
masterauth 

#Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize no

#当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 300

 数据类型

  • redis是key-value的数据,所以每个数据都是一个键值对
  • 键的类型是字符串
  • 值的类型分为五种:
  1. 字符串string
  2. 哈希hash
  3. 列表list
  4. 集合set
  5. 有序集合zset

    string类型

设置

#设置键值
set key value

#设置键值及过期时间,以秒为单位
SETEX key seconds value

#设置多个键值
MSET key value [key value...]

获取

#根据键获取值,如果不存在此键则返回null
GET key

#根据多个键获取多个值
MGET key [key...]

运算

#要求:值是数字,将key对应的value加1
INCR key

#将key对应的value加整数
INCRBY key increment

#将key对应的value减1
DECR key

#将key 对应的value减整数
DECRBY key decrement

其它

#追加值
APPEND key value

#获取值长度
STRLEN key

键操作

#查找键,参数支持正则表达
KEYS pattern

#判断键是否存在,如果存在返回1,不存在返回0
EXISTS key [key...]

#查看键对应的value的类型
TYPE key

#删除键及对应的值
DEL key [key...]

#设置过期时间,以秒为单位,创建时没有设置过期时间则一直存在,直到使用DEL移除
EXPIRE key seconds

#查看有效时间,以秒为单位
TTL key

hash类型

hash用于存储对象,对象的格式为键值对

#设置单个属性
HSET key field value

#设置多个属性
HMSET key field value [field value...]

#获取一个值属性
HGET key field

#获取所有的属性
HKEYS key

#返回包含属性的个数
HLEN key

#获取所有值
HVALS key

其它
    #判断属性 是否存在
    HEXISTS key field

    #删除属性及值
    HDEL key field [field...]

    #返回值的字符串长度
    HSTRLEN key field

list类型

  • 列表的元素类型为string
  • 按照插入顺序排序
  • 在列表的头部或者尾部添加元素
设置
    #在头部插入数据
    LPUSH key value [value...]

    #在尾部插入数据
    RPUSH key value [value...]
    
    #在一个元素的前|后插入新元素
    LINSERT key BEFORE|AFTER pivot value

    #设置指定索引的元素值
    #索引是基于0的下标
    #索引可以是负数,表示偏移量是从list尾部开始计数,如-1表示列表的最后一个元素
    LSET key index value

获取
    #移除并且返回 key 对应的 list 的第一个元素
    LPOP key

    #移除并返回存于 key 的 list 的最后一个元素
    RPOP key

    #返回存储在 key 的列表里指定范围内的元素
    #start 和 end 偏移量都是基于0的下标
    #偏移量也可以是负数,表示偏移量是从list尾部开始计数,如-1表示列表的最后一个元素
    LRANGE key start stop
其它
    #裁剪列表,改为原集合的一个子集
    #start 和 end 偏移量都是基于0的下标
    #偏移量也可以是负数,表示偏移量是从list尾部开始计数,如-1表示列表的最后一个元素
    LTRIM key start stop

    #返回存储在 key 里的list的长度
    LLEN key

    #返回列表里索引对应的元素
    LINDEX key index

set类型

  • 无序集合
  • 元素为string类型
  • 元素具有唯一性,不重复
设置
    #添加元素
    SADD key member [member ...]

获取
    #返回key集合所有的元素
    SMEMBERS key

    #返回集合元素个数
    SCARD key

其它
    #求多个集合的交集
    SINTER key [key ...]

    #求某集合与其它集合的差集
    SDIFF key [key ...]

    #求多个集合的合集
    SUNION key [key ...]

    #判断元素是否在集合中
    SISMEMBER key member

zset类型

  • sorted set  有序集合
  • 元素为string类型
  • 元素具有唯一性,不重复
  • 每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序
  • 元素的score可以相同
设置
    #添加
    ZADD key score member [score member ...]

获取
    #返回指定范围内的元素
    ZRANGE key start stop

    #返回元素个数
    ZCARD key

    #返回有序集key中,score值在min和max之间的成员
    ZCOUNT key min max

    #返回有序集key中,成员member的score值
    ZSCORE key member

发布订阅

  • 发布者不是计划发送消息给特定的接收者(订阅者),而是发布的消息分到不同的频道,不需要知道什么样的订阅者 订阅。
  • 订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的
  • 发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑
  • 客户端发到频道的消息,将会被推送到所有订阅此频道的客户端
  • 客户端不需要主动去获取消息,只需要订阅频道,这个频道的内容就会被推送过来

消息的格式

  • 推送消息的格式包含三部分
  • part1:消息类型,包含三种类型
  1. subscribe,表示订阅成功
  2. unsubscribe,表示取消订阅成功
  3. message,表示其它终端发布消息
  • 如果第一部分的值为subscribe,则第二部分是频道,第三部分是现在订阅的频道的数量
  • 如果第一部分的值为unsubscribe,则第二部分是频道,第三部分是现在订阅的频道的数量,如果为0则表示当前没有 订阅任何频道,当在Pub/Sub以外状态,客户端可以发出任何redis命令
  • 如果第一部分的值为message,则第二部分是来源频道的名称,第三部分是消息的内容

 命令

  • 订阅

SUBSCRIBE 频道名称 [频道名称 ...]

  • 取消订阅
  • 如果不写参数,表示取消所有订阅

UNSUBSCRIBE 频道名称 [频道名称 ...]

  • 发布

PUBLISH 频道 消息

 主从配置

  • 一个master可以拥有多个slave,一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构
  • 比如,将ip为192.168.1.10的机器作为主服务器,将ip为192.168.1.11的机器作为从服务器
  • 设置主服务器的配置
bind 192.168.1.10 
  • 设置从服务器的配置
  • 注意:在slaveof后面写主机ip,再写端口,而且端口必须写
bind 192.168.1.11 

slaveof 192.168.1.10 6379
  • 在master和slave分别执行info命令,查看输出信息
  • 在master上写数据
set hello world 
  • 在slave上读数据
get hello

安全配置

Redis 安全

配置密码

查看密码

CONFIG get requirepass 

设置密码

CONFIG set requirepass 123456 

远程连接

redis-cli -h 127.0.0.1 -p 6379 -a 123456 

登录之后授权

auth 123456

与Python交互

#redis模块使用

#安装
pip install redis

#引入模块
import redis

#连接
try:
    r=redis.StrictRedis(host='localhost',port=6379)
except Exception,e:
    print e.message
#方式一:根据数据类型的不同,调用相应的方法,完成读写
#更多方法同前面学的命令
r.set('name','hello')
r.get('name')

#方式二:pipline
#缓冲多条命令,然后一次性执行,减少服务器-客户端之间TCP数据库包,从而提高效率
pipe = r.pipeline()
pipe.set('name', 'world')
pipe.get('name')
pipe.execute()


#封装
#连接redis服务器部分是一致的
#这里将string类型的读写进行封装

import redis
class RedisHelper():
    def __init__(self,host='localhost',port=6379):
        self.__redis = redis.StrictRedis(host, port)
    def get(self,key):
        if self.__redis.exists(key):
        return self.__redis.get(key)
        else:
            return ""
    def set(self,key,value):
        self.__redis.set(key,value)


#示例:用户登录

#业务过程如下:
    #输入用户名、密码
    #密码加密
    #判断redis中是否记录了用户名,如果有则成功
    #如果redis中没有用户名,则到mysql中查询
    #从mysql中查询成功后,将用户名记录到redis中


from t2 import RedisHelper
from t3 import MysqlHelper
import hashlib


name=raw_input("请输入用户名:")
pwd=raw_input("请输入密码:")

sha1=hashlib.sha1()
sha1.update(pwd)
pwd1=sha1.hexdigest()

try:
    redis=RedisHelper()
    if redis.get('uname')==name:
        print 'ok'
    else:
        mysql=MysqlHelper('localhost',3306,'test1','root','mysql')
        upwd=mysql.get_one('select upwd from userinfos where uname=%s',[name])
        if upwd==None:
            print '用户名错误'
        elif upwd[0]==pwd1:
            redis.set('uname', name)
            print '登录成功'
        else:
            print "密码错误"
except Exception,e:
    print e.message

 

你可能感兴趣的:(数据库)