背景
随着互联网+大数据时代的来临,传统的关系型数据库已经不能满足中大型网站日益增长的访问量和数据量。这个时候就需要一种能够快速存取数据的组件来缓解数据库服务I/O的压力,来解决系统性能上的瓶颈。
Redis是什么?
Redis是一个高性能的,开源的,C语言开发的,键值对存储数据的nosql数据库。
NoSQL:not only sql,泛指非关系型数据库 Redis/MongoDB/Hbase Hadoop
关系型数据库:MySQL、oracle、SqlServer
数据库的发展历史
1.在互联网+大数据时代来临之前,企业的一些内部信息管理系统,一个单个数据库实例就能满足系统的需求
单数据库实例
2.随着系统访问用户的增多,数据量的增大,单个数据库实例已经满足不了系统的读取需求
缓存(memcache)+单数据库实例
3.缓存可以缓解系统的读取压力,但是数据量的写入压力持续增大,
缓存+主从数据库+读写分离
4.数据量再次增大,读写分离以后,主数据库的写库压力出现瓶颈、
缓存+主从数据库集群+读写分离+分库分表
5.互联网+大数据时代来临,关系型数据库不能很好的存取一些并发性高,实时性高的,并且数据格式不固定的数据。
nosql+主从数据库集群+读写分离+分库分表
NoSQL和SQL数据库的比较
- 适用场景不同:SQL数据库适合用于关系特别复杂的数据查询场景,nosql反之
- 事务:SQL对事务的支持非常完善,而nosql基本不支持事务
- 两者在不断的取长补短
Redis特性
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
- Redis不仅仅支持简单的key-value类型的数据,同时还提供List,set等数据类型
- Redis支持数据的备份
Redis有什么用?
Redis的主要作用:快速存取
Redis应用场景
点赞/秒杀/直播平台的在线好友列表/商品排行榜
Redis怎么用?
官网地址:https://redis.io/
命令地址:http://doc.redisfans.com/
Redis的五大数据类型以及应用场景
string/list/set/hash/zset
Redis的安装及启动
查看帮助命令redis-server --help启动服务redis-server.exe链接客户端redis-cli.exe
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 1save 300 10save 60 10000监听端口号,默认为 6379,如果你设为 0 ,redis 将不在 socket 上监听任何客户端连接。port 6379Redis默认只允许本地连接,不允许其他机器连接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是否存在
redis常用五大数据类型
1.redis-string
string是redis最基本的类型,一个key对应一个value

string可以包含任何数据,最大不能超过512M
1.set/get/del/append/strlen
set ---- 设置值get ---- 获取值mset ---- 设置多个值mget ---- 获取多个值append ---- 添加字段del ---- 删除strlen ---- 返回字符串长度
2.incr/decr/incrby/decrby
incr ---- 增加decr ---- 减少incrby ----- 制定增加多少decrby ----- 制定减少多少
3.getrange/setrange
getrange ---- 获取指定区间范围内的值,类似between....and的关系setrange ---- 代表从第几位开始替换,下脚本从零开始从0 -1表示全部
2.redis-list(单值多value)
List(列表)
列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素列表的头部(左边)或者尾部(右边)
它的底层实际是个链表

1.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 中的所有值
2.lpop/rpop
lpop/rpop ---- 移除最左/最右lpop list01 删除元素5rpop list01 删除元素1
3.lindex,按照索引下标获得元素(从上到下)
lrange list01 0 -1lindex list01 1
4.llen,求列表长度
llen list01
5.lrem key
删N个valuelrem list01 2 1 在list01中删除2个1
6.ltrim key
ltrim ---- 开始index结束index,截取指定范围的值后在赋值给keyltrim list01 0 2 截取list01 从0到2的数据在赋值给list01
7.rpoplpush list1 list2 将list1中最后一个压入list2中第一位
lrange list01 0 -1lrange list02 0 -1rpoplpush list1 list2
8.lset key index value
lset list01 0 x 将list02中第一位换成x
9.linsert key before/after
linsert list01b before x php 在x之前加字段php
3.redis-Hash
hash是一个键值对集合
hash是一个string类型的field和value的映射表,hash特别适合存储对象
1.hset/hget/hmset/hmget/hgetall/hdel
设值/取值/设值多个值/取多个值/取全部值/删除值hset user id 11hget user idhmset customer id 11 name juran age 26hmget customer id name age 只返回相应的值hgetall customer 返回全部hdel user id 删除id
2.hlen
求哈希长度hlen customer
3.hexists key
hexists ---- 在key里面的某个值存在返回1 ,不存在返回0
4.hkeys/hvals
hkeys studentshvals students
4.redis-set(不重复的)
Set(集合)
set是string类型的无序集合
1.sadd/smembers/sismember
sadd/smembers/sismember ---- 添加/查看集合/查看是否存在sadd set01 1 2 2 3 3 去掉重复添加smembers set01 得到set01sismember set01 1 如果存在返回1 不存在返回0
2.scard
scard ---- 获取集合里面的元素个数scard set01
3.srem key value
srem ---- 删除集合中元素srem set01 3SMEMBERS set01 3已经被删除掉
4.srandmember key
srandmembe ---- 随机出几个数sadd set02 1 2 3 4 5 6 7 8srandmember set02 2
5.spop key
spop ---- 随机出栈spop set01
6.smove key1 key2
sadd set03 x y zsmove set01 set03 2 将set01中的2 移动到set03中
7.数学集合类
sadd set01 1 2 3 4 5sadd 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(有序集合)
1.zadd/zrange
zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5zrange zset01 0 -1带分数返回 withscores
2.zrangebyscore key start end
zrangebyscore key start end----根据开始结束来取值zrangebyscore zset01 60 70zrangebyscore zset01 60 (90 表示不包含90zrangebyscore zset01 60 90 limit 1 2 从第一条开始截取2条
3.zrem key
zrem key value---- 某score下对应的value值,作用是删除元素zrem zset01 v1
4.zcard/zcount key score 区间/zrank key values
zcard 求zset01 总条数zcount zset01 60 90 求60-90个数zrank zset01 v2 返回1 返回对应下角标,从0开始
Python操作Redis
redispy安装及连接
安装
pip install redis
连接
r = redis.StrictRedis(host='localhost',port=6379,db=0)
字符串相关操作
import redisclass TestString(object):def __init__(self):self.r = redis.StrictRedis(host='192.168.75.130',port=6379)设置值def test_set(self):res = self.r.set('user1','juran-1')print(res)取值def test_get(self):res = self.r.get('user1')print(res)设置多个值def test_mset(self):d = {'user2':'juran-2','user3':'juran-3'}res = self.r.mset(d)取多个值def test_mget(self):l = ['user2','user3']res = self.r.mget(l)print(res)删除def test_del(self):self.r.delete('user2')
列表相关操作
class TestList(object):def __init__(self):self.r = redis.StrictRedis(host='192.168.75.130',port=6379)插入记录def test_push(self):res = self.r.lpush('common','1')res = self.r.rpush('common','2')# res = self.r.rpush('jr','123')弹出记录def test_pop(self):res = self.r.lpop('common')res = self.r.rpop('common')范围取值def test_range(self):res = self.r.lrange('common',0,-1)print(res)
集合相关操作
class TestSet(object):def __init__(self):self.r = redis.StrictRedis(host='192.168.75.130', port=6379)添加数据def test_sadd(self):res = self.r.sadd('set01','1','2')lis = ['Cat','Dog']res = self.r.sadd('set02',lis)删除数据def test_del(self):res = self.r.srem('set01',1)随机删除数据def test_pop(self):res = self.r.spop('set02')
哈希相关操作
class TestHash(object):def __init__(self):self.r = redis.StrictRedis(host='192.168.75.130', port=6379)批量设值def test_hset(self):dic = {'id':1,'name':'huawei'}res = self.r.hmset('mobile',dic)批量取值def test_hgetall(self):res = self.r.hgetall('mobile')判断是否存在 存在返回1 不存在返回0def test_hexists(self):res = self.r.hexists('mobile','id')print(res)
