1、Redis内存数据库
背景
随着互联网+大数据时代的来临,传统的关系型数据库已经不能满足中大型网站日益增长的访问量和数据量。这个时候就需要一种能够快速存取数据的组件来缓解数据库服务I/O的压力,来解决系统性能上的瓶颈。
数据库的发展历史
-
1.在互联网+大数据时代来临之前,企业的一些内部信息管理系统,一个单个数据库实例就能满足系统的需求
单数据库实例 -
2.随着系统访问用户的增多,数据量的增大,单个数据库实例已经满足不了系统的读取需求
缓存(memcache)+单数据库实例 -
3.缓存可以缓解系统的读取压力,但是数据量的写入压力持续增大;
缓存+主从数据库+读写分离 -
4.数据量再次增大,读写分离以后,主数据库的写库压力出现瓶颈;
缓存+主从数据库集群+读写分离+分库分表 -
5.互联网+大数据时代来临,关系型数据库不能很好的存取一些并发性高,实时性高的,并且数据格式不固定的数据。nosql+主从数据库集群+读写分离+分库分表
2、Redis
Redis是一个高性能的,开源的,C语言开发的,键值对存储数据的nosql数据库。
NoSQL:not only sql,泛指非关系型数据库 Redis/MongoDB/Hbase Hadoop
关系型数据库:MySQL、oracle、SqlServer
Redis特性
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
- Redis不仅仅支持简单的key-value类型的数据,同时还提供List,set等数据类型
- Redis支持数据的备份
Redis有什么用?
Redis的主要作用:快速存取
Redis应用场景
点赞/秒杀/直播平台的在线好友列表/商品排行榜/单点登录
Redis的五大数据类型以及应用场景
string/list/set/hash/zset
Redis的安装及启动
Ubuntu系统下
sudo apt-get install redis-server
查看帮助命令
redis-server --help
编辑Redis配置文件
sudo vim /etc/redis/redis.conf
将daemonize no改为 daemonize yes
保存退出
启动
redis-server
打开服务 sudo service redis start
关闭服务 sudo service redis stop
Windows系统下的开启Redis流程:直接解压即可,windows下不支持daemonize
Redis的配置文件
/etc/redis/redis.conf
当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面。
daemonize no
监听端口号,默认为 6379,如果你设为 0 ,redis 将不在 socket 上监听任何客户端连接。
port 6379
设置数据库的数目。
databases 16
根据给定的时间间隔和写入次数将数据保存到磁盘
下面的例子的意思是:
900 秒内如果至少有 1 个 key 的值变化,则保存
300秒内如果至少有 10 个 key 的值变化,则保存
60 秒内如果至少有 10000 个 key 的值变化,则保存
save 900 1
save 300 10
save 60 10000
监听端口号,默认为 6379,如果你设为 0 ,redis 将不在 socket 上监听任何客户端连接。
port 6379
Redis默认只允许本地连接,不允许其他机器连接
bind 127.0.0.1
更多配置文件:https://www.cnblogs.com/kreo/p/4423362.html
Redis数据库简单使用
DBSIZE------------------------- 查看当前数据库的key数量
keys * --------------------------- 查看key的内容
FLUSHDB --------------------- 清空当前数据库的key的数量
FLUSHALL -------------------- 清空所有库的key(慎用)
exists key -----------------------判断key是否存在
3、redis常用五大数据类型
1.redis-string
string是redis最基本的类型,一个key对应一个value
string可以包含任何数据,最大不能超过512M
set/get/del/append/strlen
set ---- 设置值
get ---- 获取值
mset ---- 设置多个值
mget ---- 获取多个值
append ---- 添加字段
del ---- 删除
strlen ---- 返回字符串长度
incr/decr/incrby/decrby
incr ---- 增加
decr ---- 减少
incrby ----- 制定增加多少
decrby ----- 制定减少多少
getrange/setrange
getrange ---- 获取指定区间范围内的值,类似between....and的关系
setrange ---- 代表从第几位开始替换,下脚本从零开始从0 -1表示全部
2.redis-list(单值多value)
List(列表)
列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素列表的头部(左边)或者尾部(右边)
它的底层实际是个链表
lpush/rpush/lrange
lpush/rpush/lrange ---- 从左/从右/获取指定长度
lpush list01 1 2 3 4 5 倒序排列
rpush list02 1 2 3 4 5 正序排列
lrange list01 0 -1 获取list01 中的所有值
lpop/rpop
lpop/rpop ---- 移除最左/最右
lpop list01 删除最左元素
rpop list01 删除最右元素
lindex,按照索引下标获得元素(从上到下)
lrange list01 0 -1
lindex list01 1
llen,求列表长度
llen list01
lrem key
删N个value
lrem list01 2 1 在list01中删除2个1
ltrim key
ltrim ---- 开始index结束index,截取指定范围的值后在赋值给key
ltrim list01 0 2 截取list01 从0到2的数据在赋值给list01
rpoplpush list1 list2 将list1中最后一个压入list2中第一位
lrange list01 0 -1
lrange list02 0 -1
rpoplpush list1 list2
lset key index value
lset list01 0 x 将list02中第一位换成x
linsert key before/after
linsert list01b before x php 在x之前加字段php
3.redis-Hash
hash是一个键值对集合
hash是一个string类型的field和value的映射表,hash特别适合存储对象
hset/hget/hmset/hmget/hgetall/hdel
设值/取值/设值多个值/取多个值/取全部值/删除值
hset user id 11
hget user id
hmset customer id 11 name juran age 26
hmget customer id name age 只返回相应的值
hgetall customer 返回全部
hdel user id 删除id
hlen 求哈希长度
hlen customer
hexists key
hexists ---- 在key里面的某个值
存在返回1 ,不存在返回0
hkeys/hvals
hkeys students
hvals students
4.redis-set(不重复的)
Set(集合)
set是string类型的无序集合,没有重复元素
sadd/smembers/sismember
sadd/smembers/sismember ---- 添加/查看集合/查看是否存在
sadd set01 1 2 2 3 3 去掉重复添加
smembers set01 得到set01
sismember set01 1 如果存在返回1 不存在返回0
scard
scard ---- 获取集合里面的元素个数
scard set01
srem key value
srem ---- 删除集合中元素
srem set01 3
SMEMBERS set01 3已经被删除掉
srandmember key
srandmembe ---- 随机出几个数
sadd set02 1 2 3 4 5 6 7 8
srandmember set02 2
spop key
spop ---- 随机出栈
spop set01
smove key1 key2
sadd set03 x y z
smove set01 set03 2 将set01中的2 移动到set03中
数学集合类
sadd set01 1 2 3 4 5
sadd set02 1 2 3 a b
差集
SDIFF set01 set02 返回 4 5 在第一个set中不在第二个set中
交集
SINTER set01 set02 返回 1 2 3
并集
SUNION set01 set02 返回set01 set02 中的值 去掉重复
5.redis-Zset
Zset(有序集合)
zadd/zrange
zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5
zrange zset01 0 -1
带分数返回 withscores
zrangebyscore key start end
zrangebyscore key start end----根据开始结束来取值
zrangebyscore zset01 60 70
zrangebyscore zset01 60 (90 表示不包含90
zrangebyscore zset01 60 90 limit 1 2 从第一条开始截取2条
zrem key
zrem key value---- 某score下对应的value值,作用是删除元素
zrem zset01 v1
zcard/zcount key score 区间/zrank key values
zcard 求zset01 总条数
zcount zset01 60 90 求60-90个数
zrank zset01 v2 返回1 返回对应下角标,从0开始
4、Python操作Redis
redispy安装及连接
安装
pip install redis
连接
r = redis.StrictRedis(host='localhost',port=6379,db=0)
字符串相关操作
import redis
class TestString(object):
def __init__(self):
self.r = redis.StrictRedis(host='127.0.0.1', port=6379)
# 设置值
def string_set(self, keys, items):
res = self.r.set(keys, items)
print(res) # 返回的是布尔类型的值
# 取值
def string_get(self, keys):
res = self.r.get(keys)
return res
# 设置多个值
def string_mset(self, items):
if isinstance(items, dict):
res = self.r.mset(items)
print(res)
# 取多个值
def string_mget(self, keys):
if isinstance(keys, dict):
res = self.r.mget(keys)
print(res)
# 删除
def string_del(self, keys):
if self.r.exists(keys):
self.r.delete(keys)
else:
# return "{} is not found".format(keys)
raise ValueError("{} is not found".format(keys))
if __name__ == '__main__':
s = TestString()
d = {
"user": "123",
"user1": "1"
}
s.string_mset(d)
print(s.string_del("user"))
列表相关操作
import redis
class List_Redis(object):
def __init__(self):
self.r = redis.StrictRedis(host='127.0.0.1', port=6379)
# 添加值
def list_lpush(self, keys, items):
res = self.r.lpush(keys, items)
return res
# 删除元素
def list_lpop(self, keys):
result = self.r.lpop(keys)
return result
if __name__ == '__main__':
l = List_Redis()
# l.list_lpush('li9', '1 2 3 4 5 6 7 8 8 9')
l.list_lpop("li9")
集合相关操作
import redis
class Set_Redis(object):
def __init__(self):
self.r = redis.StrictRedis(host='127.0.0.1', port=6379)
# 添加数据
def set_sadd(self,keys, items):
result = self.r.sadd(keys, items)
return result
# 删除数据
def set_srem(self, keys, values):
res = self.r.srem(keys, values)
return res
# 随机删除元素
def set_pop(self, keys):
res = self.r.spop(keys)
return res
if __name__ == '__main__':
s = Set_Redis()
s.set_sadd('s1', '1 2 3 4 5')
s.set_pop('s1')
哈希相关操作
import redis
class Hash_Redis(object):
def __init__(self):
self.r = redis.StrictRedis(host='127.0.0.1', port=6379)
# 设置值
def hash_hset(self, keys, items,values):
result = self.r.hset(keys, items, values)
return result
# 取值
def hash_hgetall(self, keys):
result = self.r.hgetall(keys)
return result
# 判断是否存在 存在返回1 不存在返回0
def hash_hexists(self, keys, values):
res = self.r.hexists(keys, values)
print(res)
if __name__ == '__main__':
h = Hash_Redis()
h.hash_hset('h1', 'id', '1')
5、Redis主从配置
- ⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构
- master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1
- 通过主从配置可以实现读写分离
- master和slave都是一个redis实例(redis服务)
主从配置
配置主
修改etc/redis/redis.conf文件
bind 0.0.0.0 或者改成本机IP
配置从
复制etc/redis/redis.conf文件
cp redis.conf slave.conf
修改redis/slave.conf文件
vim slave.conf
bind 192.168.154.131(主机IP)
slaveof 192.168.154.131(主机IP) 6379(主机端口)
port 6378(从机端口)
开启主机服务
src/redis-server slave.conf
src/redis-cli -h 0.0.0.0 -p 6379
进入从的客户端
src/redis-cli -h 192.168.154.131 -p 6378
来源:CSDN
作者:越过山丘,佳人等候
链接:https://blog.csdn.net/weixin_42118531/article/details/104729275