nosql :一类新出现的数据库(not only sql) 它的特点:
不支持sql语法
存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式
NoSQL的世界中没有一种通用的语言,每种nosql数据库都有自己的api和语法,以及擅长的业务场景
NoSQL中的产品种类相当多:
Redis 与其他 key - value 缓存产品有以下三个特点:
下载
当前redis的最新版是5.0下载链接
安装步骤
step1:下载
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
step2:解压
tar -xvf redis-5.0.5.tar.gz
step3:复制,放到usr/local⽬录下
mv redis-5.0.5 /usr/local/redis/
step4:进⼊redis⽬录
cd /usr/local/redis/
step5:生成
sudo make
step6:测试,这段运⾏时间会较⻓
sudo make test
step7:安装,将redis的命令安装到/usr/local/bin/⽬录
sudo make install
step8:安装完成后,我们进入目录/usr/local/bin中查看
cd /usr/local/bin
ls -all
redis-server redis服务器
redis-cli redis命令行客户端
redis-benchmark redis性能测试工具
redis-check-aof AOF文件修复工具
redis-check-rdb RDB文件检索工具
step9:配置⽂件,移动到/etc/⽬录下
配置⽂件⽬录为/usr/local/redis/redis.conf
sudo cp /usr/local/redis/redis.conf /etc/redis/
配置
Redis的配置信息在/etc/redis/redis.conf下。
查看
sudo vi /etc/redis/redis.conf
核心配置选项
绑定ip:如果需要远程访问,可将此⾏注释,或绑定⼀个真实ip
bind 127.0.0.1
端口默认为6379
port 6379
是否以守护进程运⾏
daemonize yes
如果以守护进程运⾏,则不会在命令⾏阻塞,类似于服务
如果以⾮守护进程运⾏,则当前终端被阻塞
设置为yes表示守护进程,设置为no表示⾮守护进程
推荐设置为yes
数据⽂件
dbfilename dump.rdb
数据⽂件存储路径
dir /var/lib/redis
⽇志⽂件
logfile /var/log/redis/redis-server.log
数据库,默认有16个
database 16
主从复制,类似于双机备份
slaveof
字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
保存
如果设置的键不存在则为添加,如果设置的键已经存在则修改
set key value
setex key seconds value
setex aa 3 aa
mset key1 value1 key2 value2 …
append key value
append ‘a1’ ‘haha’
获取
get key
get ‘name’
mget key1 key2 …
mget a1 a2 a3
删除
del 键
keys pattern
exists key1
expire key seconds
hash⽤于存储对象,对象的结构为属性、值,值的类型为string
增加、修改
hset key field value
hset user name itheima
有时候会报MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.的错误
Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用
原因:强制关闭Redis快照导致不能持久化。 解决方案:运行config set stop-writes-on-bgsave-error no 命令后,关闭配置项stop-writes-on-bgsave-error解决该问题。
hmset key field1 value1 field2 value2 …
获取
获取指定键所有的属性
hkeys key
例3:获取键user的所有属性
获取⼀个属性的值
hget key field
例4:获取键user 属性’name’的值
获取多个属性的值
hmget key field1 field2 …
获取所有属性的值
hvals key
删除
删除整个hash键及值,使⽤del命令
删除属性,属性对应的值会被⼀起删除
hdel key field1 field2 …
例5:删除键’user’的属性’name’
增加
lpush key value1 value2 …
rpush key value1 value2 …
linsert key before或after 现有元素 新元素
linsert user before b 3
获取
返回列表⾥指定范围内的元素
1.start、stop为元素的下标索引
2.索引从左侧开始,第⼀个元素为0
3.索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
lrange key start stop
例4:获取键为’user’的列表所有元素
设置指定索引位置的元素值
删除
删除指定元素
将列表中前count次出现的值为value的元素移除
count > 0: 从头往尾移除
count < 0: 从尾往头移除
count = 0: 移除所有
lrem key count value
例6.1:向列表’a2’中加⼊元素’a’、‘b’、‘a’、‘b’、‘a’、‘b’
例6.2:从’a2’列表右侧开始删除2个’b’
例6.3:查看列表’py12’的所有元素
⽆序集合
元素为string类型
元素具有唯⼀性,不重复
说明:对于集合没有修改操作
增加
sadd key member1 member2 …
获取
删除
增加
zadd key score1 member1 score2 member2 …
获取
返回指定范围内的元素
start、stop为元素的下标索引
索引从左侧开始,第⼀个元素为0
索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
zrange key start stop
例2:获取键’a4’的集合中所有元素
返回score值在min和max之间的成员
zrangebyscore key min max
例3:获取键’a4’的集合中权限值在5和6之间的成员
返回成员member的score值
zscore key member
例4:获取键’a4’的集合中元素’zhangsan’的权重
删除
zrem key member1 member2 …
zremrangebyscore key min max
安装完redis模块后在python包中调用引入模块
from redis import *
这个模块中提供了StrictRedis对象(Strict严格),⽤于连接redis服务器,并按照不同类型提供 了不同⽅法,进⾏交互操作
sr = StrictRedis(host=‘localhost’, port=6379, db=0)
简写
sr=StrictRedis()
根据不同的类型,拥有不同的实例⽅法可以调⽤,与前⾯redis命令对应,⽅法需要的参数与命令的参数⼀致
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
except Exception as e:
print(e)
string-增加
```python
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#添加键name,值为itheima
result=sr.set('name','itheima')
#输出响应结果,如果添加成功则返回True,否则返回False
print(result)
except Exception as e:
print(e)
string-获取
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#获取键name的值
result = sr.get('name')
#输出键的值,如果键不存在则返回None
print(result)
except Exception as e:
print(e)
string-修改
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#设置键name的值,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
result = sr.set('name','itcast')
#输出响应结果,如果操作成功则返回True,否则返回False
print(result)
except Exception as e:
print(e)
string-删除
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#设置键name的值,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
result = sr.delete('name')
#输出响应结果,如果删除成功则返回受影响的键数,否则则返回0
print(result)
except Exception as e:
print(e)
获取键
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#获取所有的键
result=sr.keys()
#输出响应结果,所有的键构成⼀个列表,如果没有键则返回空列表
print(result)
except Exception as e:
print(e)
django存储session
之前django的session默认是存在的数据库里面的,我们也可以把session存储在redis里面
def session_set(request):
request.session['name']='itheima'
return HttpResponse('ok')
def session_get(request):
name=request.session['name']
return HttpResponse(name)
url(r'^session_set/$',views.session_set),
url(r'^session_get/$', views.session_get),
主从概念
1.⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构
2.master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1
3.通过主从配置可以实现读写分离
4.master和slave都是一个redis实例(redis服务)
主从配置
配置从
sudo cp redis.conf ./slave.conf
sudo vi slave.conf
bind 106.12.70.101
slaveof 106.12.70.101 6379
port 6378
sudo redis-server slave.conf
redis-cli -h 106.12.70.101 info Replication
数据操作
redis-cli -h 106.12.70.101 -p 6379
redis-cli -h 106.12.70.101 -p 6378
set aa aa
get aa