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下载与安装
- 下载
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
- 解压
tar -zxvf redis-5.0.3.tar.gz
- 复制,放到/usr/local/local目录下
sudo mv ./redis-5.0.3 /usr/local/redis
- 进入redis目录
cd /usr/local/redis/
- 生成
sudo make
- 测试,这段运行时间会较长
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
- 安装,将redis的命令安装到/usr/bin/目录
sudo make install
- 安装完成后,进入目录/usr/bin中查看
cd /usr/bin
ls -all
- 配置文件,移动到/etc目录下
- 配置文件目录为/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服务