12-Redis数据库

nosql介绍

**NoSQL:一类新出现的数据库(not only sql),他的特点:

  • 不支持SQL语法
  • 存储结构跟传统的关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式
  • NoSQL的世界中没有一种通用的语言,每种nosql数据库都有自己的api和语法,以及擅长的业务场景
  • NoSQL中的产品种类相当多:
    • Mongodb
    • Redis
    • Hbase hadoop
    • Cassandra hadoop

NoSQL和SQL数据库的比较

  • 使用场景不同:sql数据库适合用于关系特别复杂的数据库查询场景,nosql反之
  • “事物”特性的支持:sql对事物的支持非常完善,而nosql基本不支持事物
  • 两者在不断的取长补短,呈现融合趋势
Redis简介
  • Redis是一个开源的使用ANSI C语言编写,支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis开发由Pivotal赞助。
  • Redis是NoSQL技术阵营中的一员,它通过多种键值数据类型来适应不同场景下的存储需求,借助一些高级的接口使用其可以胜任,如缓存、队列系统的不同角色
Redis特性
  • Redis与其他key-value缓存产品有一下三个特点:
  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
  • Redis支持数据的备份,即master-slave模式的数据备份
Redis优势
  • 性能极高-Redis能读的速度是110000次/s,写的速度是81000次/s.
  • 丰富的数据类型-Redis支持二进制案例的Strings,Lists,Hashes,Sets及Ordered Sets数据类型操作
  • 原子- Redis的所有操作都是原子的,同时Redis还支持对几个操作合并后的原子性执行
  • 丰富的特性- Redis还支持publish/subscribe,通知,key过期等等特性
Redis应用场景
  • 用来做缓存(ehcache/memcached)--redis的所有数据是放在内存中的(内存数据库)
  • 可以再某些特性应用场景下替代传统数据库--比如社交类的应用
  • 在一些大型系统中,巧妙的实现一些特定的功能:session共享,购物车
Redis下载与安装
  1. 下载
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
  1. 解压
tar -zxvf redis-5.0.3.tar.gz
  1. 复制,放到/usr/local/local目录下
sudo mv ./redis-5.0.3 /usr/local/redis
  1. 进入redis目录
cd /usr/local/redis/
  1. 生成
sudo make
  1. 测试,这段运行时间会较长
sudo make test

测试问题

1.wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz  
2.sudo tar xzvf tcl8.6.1-src.tar.gz  -C /usr/local/  
3.cd  /usr/local/tcl8.6.1/unix/  
4.sudo ./configure  
5.sudo make  
6.sudo make install 
  1. 安装,将redis的命令安装到/usr/bin/目录
sudo make install
  1. 安装完成后,进入目录/usr/bin中查看
cd /usr/bin
ls -all
  1. 配置文件,移动到/etc目录下
  2. 配置文件目录为/usr/local/redis/redis.conf
sudo cp /usr/local/redis/redis.conf /etc/redis/
配置
  • Redis的配置信息在/etc/redis/redis.conf下
  • 查看
sudo vim /etc/redis/redis.conf
核心配置选项
  • 绑定ip:如果需要远程访问,可将此行注释,或者绑定一个真实ip
bind 127.0.0.1
  • 端口:默认为6379
port 6379
  • 是否以守护进程运行
    • 如果以守护进程运行,则不会在命令行阻塞,类似于服务
    • 如果以非守护进程运行,则当前终端被阻塞
    • 设置为yes表示守护进程,设置为no表示非守护进程
    • 推荐设置为yes
daemonize yes
  • 数据文件
dbfilename dump.rdb
  • 数据文件存储路径
dir /var/lib/redis
  • 日志文件
logfile /var/log/redis/redis-server.log
  • 数据库,默认有16个
database 16
  • 主从复制,类似于双机备份
slaveof
Redis服务器端和客户端的命令

服务器端

  • 服务器端的命令为redis-server
  • 可以使用help查看帮助文档
redis-server --help
  • 推荐使用服务的方式管理redis服务
  • 启动
sudo service redis start
  • 停止
sudo service redis stop
  • 重启
sudo service redis restart
  • 个人习惯
ps -ef | grep redis  # 查看Redis服务器进进程
sudo kill -9 pid # 杀死redis服务器
sudo redis-service /etc/redis/redis.conf  # 指定加载的配置文件

客户端

  • 客户端的命令为redis-cli
  • 可以使用help查看帮助文档
redis-cli --help
  • 连接redis
redis-cli
  • 运行测试命令
ping
  • 切换数据库
  • 数据库没有名称,默认有16个,通过0-15来标识,连接redis默认选择第一个数据库
select n
Redis存储数据结构

数据结构

  • redis是key-value的数据结构,每条数据都是一个键值对
  • 键的类型是字符串
  • 注意:键不能重复
  • 值的类型分为5种:
    • 字符串string
    • 哈希hash
    • 列表list
    • 集合set
    • 有序集合zset
string类型
  • 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接收任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。

保存
如果设置的键不存在则为添加,如果设置的键已经存在则修改

  • 设置键值
set key value
例如:
set name itcat
  • 设置键值及过期时间,以秒为单位
setex key seconds value
例如:
setex aa 3 aa
  • 设置多个键值
mset key1 value key2 value2...
例如:
mset a1 python a2 java a3 c
  • 追加值
append key value
例如:
append a1 'haha'

获取

  • 获取:根据键获取,如果不存在此键则焚毁nil
get key
例如:
get name
  • 根据多个键获取多个值
mget key1 key2
例如:
mget a1 a2 a3

键命令

  • 查找键,参数支持正则表达式
keys pattern
例如:
keys *
keys 'a*'
  • 判断键是否存在,如果存在返回1,否则返回0
exists key
例如:
exists a1
  • 查看键对应的value的类型
type key
例如:
type a1
  • 删除键以及对应的值
del key1 key2...
例如:
del a1 a2
  • 设置过期时间,以秒为单位
  • 如果没有指定过期时间则一直存在,直到使用DEL移除
expire key seconds
例如:
expire a1 10
  • 查看有效时间,以秒为单位
ttl key
例如
ttl a1

hash类型

  • hash用于存储对象,对象的结构为属性、值
  • 值的类型为string

增加、修改

  • 设置单个属性
hset key field value
例如:
hset user name itheima
  • 设置多个属性
hmset key field value1 field2 value2...
例如:
hmset u2 name itcast age 11

获取

  • 获取指定键所有的属性
hkeys key
例如:
hkeys u2
  • 获取一个属性的值
hget key field
例如:
hget u2 name
  • 获取多个属性的值
hmget key field field2
例如:
hmget u2 name age
  • 获取所有属性的值
hvals key
例如:
hvals u2

删除

  • 删除整个hash键及值,使用del命令
  • 删除属性,属性对应的值会被一起删除
hdel key field1 field2...
例如:
hdel u2 name
list类型
  • 列表的元素类型为string
  • 按照插入顺序排序

增加

  • 在左侧插入数据
lpush key value1 value2...
例如:
lpush a1 a b c
  • 在右侧插入数据
rpushh key value1 value2...
例如:
rpush a1 0 1
  • 在指定元素的前或后插入新元素
linsert key before 或者 after 现有元素 新元素
例如:
linsert a1 before b 3

** 获取**

  • 返回列表里指定范围内的元素
    • start 、stop为元素的下标索引
    • 索引从左侧开始,第一个元素是0
    • 索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素
lrange key start stop
例如:
lrange a1 0 -1

设置指定索引位置的元素值

  • 索引从左侧开始,第一个元素为0
  • 索引可以是负数,表示尾部开始计数,如-1表示最后一个元素
lset key index value
例如:
lset a 1 z

删除

  • 删除指定元素
    • 将列表中前count次出现的值为value的元素移除
    • count>0:从头往尾移除
    • count<0: 从尾往头移除
    • count=0:移除所有
lpush a2 a b a b a b
lrem a2 -2 b
lrange a2 0 -1
set类型
  • 无序集合
  • 元素为string类型
  • 元素具有唯一性,不重复
  • 说明:对于集合没有修改操作

操作

  • 添加元素
sadd key member1 member2...
例如:
sadd a3 zhangsan lisi wangwu

获取

  • 返回所有的元素
smembers key 
例如:
smembers a3

删除

  • 删除指定元素
srem key
例如:
srem a3 wangwu
zset类型
  • sorted set ,有序集合
  • 元素为string类型
  • 元素具有唯一性,不重复
  • 每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序
  • 说明:没有修改操作

增加

  • 添加
zadd key score1 member1 score2 member2...
例如:
zadd a4 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan
  • 获取
  • 返回指定范围内的元素
  • start、stop为元素的下标索引
  • 索引从左侧开始,第一个元素为0
  • 索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素
zrange key start stop
zrange a4 0 -1
  • 返回score值在min和max之间的成员
zrangebyscore key min max
例如:
zrangebyscore a4 5 6
  • 返回成员member的score值
zscore key member
例如:
zscore a4 zhangsan

删除

  • 删除指定元素
zrem key member1 member2...
例如:
zrem a3 zhangsan
  • 删除权重在指定范围的元素
zremrangebyscore key min max
例如:
zremrangebyscore a4 5 6
redis与ptyhon交互

安装redis

  • 方法1:进入虚拟环境
    pip install redis
  • 方法2:进入虚拟环境
    easy_install redis

StrictRedis对象方法
通过init创建对象,指定参数host,port与指定的服务器和端口连接,host默认是localhost,port默认是6379,db默认为0
sr = StrictRedis(host='localhost',port=6379,db=0)
简写
sr = StrictRedis()

from redis import StrictRedis


if __name__ == '__main__':
    try:
        sr = StrictRedis()
        # 添加一个key,为name value itheima
        res = sr.set('name','itheima')
        print(res)

        # 获取name值
        name = sr.get('name')
        print(name)

        # 珊瑚name及对应的值
        res = sr.delete('name')
        print(res)

        # 删除多个键以及其对应的值
        res = sr.delete('a1','a3')
        print(res)

        # 获取数据库中所有的键
        res = sr.keys()
        print(res)
    except Exception as e:
        print(e)

session的redis存储配置
  • 安装包
    pip install django-redis-sessions==0.5.6
  • 修改settings文件,增加如下项
# 设置rdis存储session信息
SESSION_ENGINE = 'redis_sessions.session'
# redis服务的ip地址
SESSION_REDIS_HOST = 'localhost'
# redis服务的端口号
SESSION_REDIS_PORT = 6379
# redis中的那个数据库
SESSION_REDIS_DB = 2
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'
redis主从配置

主从概念

  • 一个master可以拥有多个slave,一个slave又可以拥有多个slave,如此下去,行程了强大的多级服务器集群架构
  • master用来写数据,slave用来读取数据,经统计:网站的读写比率是10:1
  • 通过主从配置可以实现读写分离

配置主

  • 查看当前主机的ip地址
    ifconfig
  • 修改etc/redis/redis.conf文件
    sudo vi redis.conf
    bind 192.168.26.128
  • 重启redis服务
    sudo redis-server redis.conf

配置从

  • 赋值etc/redis/redis.conf文件
    sudo cp redis.conf ./slave.conf
  • 修改redis/slave.conf文件
    sudo vim slave.conf
  • 编辑内容
    bind 192.168.0.208
    slaveof 192.168.208 6379
    port 6378
  • redis服务
    sudo redis-server slave.conf
  • 查看主从关系
    redis-cli -h 192.168.0.208 info Replication
集群

集群概念
集群是一组相互独立的,通过高速无网络互联的计算机,他们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。

redis集群

  • 分类
    • 软件层面
    • 硬件层面
  • 软件层面:只有一台电脑,在这台电脑上启动了多个redis服务
  • 硬件层面:存在多台实体的电脑,每台电脑上启动了一个redis或者多个redis服务

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