redis学习笔记
redis介绍
定义
Redis(Remote Dictionary Server ,远程字典服务) 是一个使用ANSIC编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库,是NoSQL数据库。
redis的出现主要是为了替代早期的Memcache缓存系统的。map内存型(数据存放在内存中)的非关系型(nosql)key-value(键值存储)数据库,支持数据的持久化(基于RDB和AOF,注: 数据持久化时将数据存放到文件中,每次启动redis之后会先将文件中数据加载到内存,经常用来做缓存、数据共享、购物车、消息队列、计数器、限流等。(最基本的就是缓存一些经常用到的数据,提高读写速度)。
redis特性:
- 速度快
- 持久化
- 多种数据结构
- 支持多种编程语言
- 主从复制
- 高可用、分布式
Redis的数据类型及主要特性
Redis提供的数据类型主要分为5种自有类型和一种自定义类型,这5种自有类型包括:String类型、哈希类型、列表类型、集合类型和顺序集合类型。
redis={
"name":"yuan",
"age":"23",
"scors":[78,79,98,],
"info":{"gender":"male","tel":"110"},
"set":{1,2,3},
"zset":{1,2,3,}
}
Redis的应用场景有哪些?
Redis 的应用场景包括:
缓存系统(“热点”数据:高频读、低频写):缓存用户信息,优惠券过期时间,验证码过期时间、session、token等
计数器:帖子的浏览数,视频播放次数,评论次数、点赞次数等
消息队列,秒杀系统
社交网络:粉丝、共同好友(可能认识的人),兴趣爱好(推荐商品)
排行榜(有序集合)
发布订阅:粉丝关注、消息通知
redis环境安装
redis的官方只提供了linux版本的redis,window系统的redis是微软团队根据官方的linux版本高仿的。* *
Linux 安装redis
1.第一步需要安装对应的gcc环境,不然可能会报错
yum -y install gcc-c++
2.下载redis
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
3.放到 usr/local/redis 下面
mv redis-6.2.6/ /usr/local/redis/
4.cd 进入redis下面,编译
make
如果执行make命令报错:cc 未找到命令,原因是虚拟机系统中缺少gcc,
执行下面命令安装gcc:
yum -y install gcc automake autoconf libtool make
如果执行make命令报错:
致命错误:jemalloc/jemalloc.h: 没有那个文件或目录,
则需要在make指定分配器为libc。执行下面命令即可正常编译:
make MALLOC=libc
make命令执行完,redis就编译完成了。
2、执行下面命令安装redis,并指定安装目录
make install PREFIX=/usr/local/redis
5.安装指定目录下面
make install PREFIX=/usr/local/redis/redis-6.2.6
6.启动redis 在bin同级目录下
./bin/redis-server redis.conf
但这种启动方式不能退出控制台,如果退出,那么redis服务也会停止。如果想要redis以后台方式运行,需要修改redis的配置文件:redis.conf。将该配置文件中的daemonize no改为daemonize yes
ps -ef|grep redis # 查看redis进程
./bin/redis-cli 查看redis是否能用
redis可以理解成一个全局的大字典,key就是数据的唯一标识符。根据key对应的值不同,可以划分成5个基本数据类型。
redis = {
"name":"yuan",
"scors":["100","89","78"],
"info":{
"name":"rain"
"age":22
},
"s":{item1,itme2,..}
}
1. string类型:
字符串类型,是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制安全的,也就是byte类型。
单个数据的最大容量是512M。
key: 值
2. hash类型:
哈希类型,用于存储对象/字典,对象/字典的结构为键值对。key、域、值的类型都为string。域在同一个hash中是唯一的。
key:{
域(属性): 值,
域:值,
域:值,
域:值,
...
}
3. list类型:
列表类型,它的子成员类型为string。
key: [值1,值2, 值3.....]
4. set类型:
无序集合,它的子成员类型为string类型,元素唯一不重复,没有修改操作。
key: {值1, 值4, 值3, ...., 值5}
5. zset类型(sortedSet):
有序集合,它的子成员值的类型为string类型,元素唯一不重复,没有修改操作。权重值(score,分数)从小到大排列。
key: {
值1 权重值1(数字);
值2 权重值2;
值3 权重值3;
值4 权重值4;
}
python 操作redis
连接redis
# 方式1
import redis
r = redis.Redis(host='127.0.0.1', port=6379)
r.set('foo', 'Bar')
print(r.get('foo'))
# 方式2 redis连接池
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)
r.set('bar', 'Foo')
print(r.get('bar'))
通常情况下, 当我们需要做redis操作时, 会创建一个连接, 并基于这个连接进行redis操作, 操作完成后, 释放连接,一般情况下, 这是没问题的, 但当并发量比较高的时候, 频繁的连接创建和释放对性能会有较高的影响。于是, 连接池就发挥作用了。连接池的原理是, 通过预先创建多个连接, 当进行redis操作时, 直接获取已经创建的连接进行操作, 而且操作完成后, 不会释放, 用于后续的其他redis操作。这样就达到了避免频繁的redis连接创建和释放的目的, 从而提高性能。
数据类型操作
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0, decode_responses=True)
r = redis.Redis(connection_pool=pool)
# 一 : 字符串操作
# (1)字符串操作:不允许对已经存在的键设置值
ret = r.setnx("name", "yuan")
print(ret)
# (2)字符串操作:设置键有效期
r.setex("good_1001", 10, "2")
# (3)字符串操作:自增自减
r.set("age", 20)
r.incrby("age", 2)
print(r.get("age")) # b'22'
# 二 : hash操作
r.hset("info", "name", "rain")
print(r.hget("info", "name")) # b'rain'
r.hset("info", mapping={"gender": "male", "age": 22})
print(r.hgetall("info")) # {b'name': b'rain', b'gender': b'male', b'age': b'22'}
# 三 : list操作
r.rpush("scores", "100", "90", "80")
r.rpush("scores", "70")
r.lpush("scores", "120")
print(r.lrange("scores", 0, -1)) # ['120', '100', '90', '80', '70']
r.linsert("scores", "AFTER", "100", 95)
print(r.lrange("scores", 0, -1)) # ['120', '100', '95', '90', '80', '70']
print(r.lpop("scores")) # 120
print(r.rpop("scores")) # 70
print(r.lindex("scores", 1)) # '95'
# 四 : 集合操作
# key对应的集合中添加元素
r.sadd("name_set", "zhangsan", "lisi", "wangwu")
# 获取key对应的集合的所有成员
print(r.smembers("name_set")) # {'lisi', 'zhangsan', 'wangwu'}
# 从key对应的集合中随机获取 numbers 个元素
print(r.srandmember("name_set", 2))
r.srem("name_set", "lisi")
print(r.smembers("name_set")) # {'wangwu', 'zhangsan'}
# 五 :有序集合操作
# 在key对应的有序集合中添加元素
r.zadd("jifenbang", {"yuan": 78, "rain": 20, "alvin": 89, "eric": 45})
# 按照索引范围获取key对应的有序集合的元素
print(r.zrange("jifenbang", 0, -1)) # ['rain', 'eric', 'yuan', 'alvin']
print(
r.zrange("jifenbang", 0, -1, withscores=True)) # [('rain', 20.0), ('eric', 45.0), ('yuan', 78.0), ('alvin', 89.0)]
print(r.zrevrange("jifenbang", 0, -1,
withscores=True)) # [('alvin', 89.0), ('yuan', 78.0), ('eric', 45.0), ('rain', 20.0)]
print(r.zrangebyscore("jifenbang", 0, 100)) # ['rain', 'eric', 'yuan', 'alvin']
print(r.zrangebyscore("jifenbang", 0, 100, start=0, num=2)) # ['rain', 'eric']
# 删除key对应的有序集合中值是values的成员
print(r.zrem("jifenbang", "yuan")) # 删除成功返回1
print(r.zrange("jifenbang", 0, -1)) # ['rain', 'eric', 'alvin']
# 六 :键值对操作
r.delete("scores")
print(r.exists("scores"))
# 查看所有的鍵
print(r.keys("*"))
# 查看名字的鍵
print(r.keys("gujie*")) #gujie1 gujie2 gujie3
r.expire("name", 10)

浙公网安备 33010602011771号