首页 > 数据库 >Redis基础(01)

Redis基础(01)

时间:2023-03-07 21:37:23浏览次数:44  
标签:01 name 基础 redis value set Redis conn

目录

1 Redis介绍与安装

# redis:缓存数据库 [大部分时间做缓存,不仅仅可以做缓存],非关系型数据库[区别于mysql关系型数据库]
	-nosql: 非关系型数据库
    -C语言写的 服务(监听端口),用来存储数据的,数据是存储在内存中,取值,放值速度非常快, 10w qps
 
# 面试题:redis为什么这么快
	-1 纯内存操作
    -2 网络模型使用的IO多路复用(epo11)(可以处理的请求数更对多)
    -3  6.x之前,单进程,单线程架构,没有线程进程间切换,更少的消耗资源
   
# key-value形式存储,没有表的概念


# 版本:
	最新: 7.x
    公司里: 5.x比较多
     
# 安装
	-mac    源码编译安装
    -linux  源码编译安装
    -win	微软自己 基于源码改动,编译成安装包
 # 最新5.x版本
 https://github.com/tporadowski/redis/releases/   
 # 最新3.x版本
 https://github.com/microsoftarchive/redis/releases
    一路下一步,安装完成释放出两个命令,会把redis自动加入到服务中
     redis-server     # mysqld  服务端的启动命令
     redis-cli		 # mysql   客户端的启动命令
# 安装目录
	redis-server
    redis-cli
    redis.windows-service.conf	 配置文件
    	-blind 127.0.0.1  # 服务,跑在的地址
        -port 6379		# 监听的端口
       
   
# 启动redis
	1 方式一:
        -在服务中,点击启动,后台启动
    2 方式二: 使用命令
        redis-server 指定配置文件  如果不指定,会默认
     
# 客户端连接redis
	1 方式一
    	redis-cli   # 默认连接本地的6379端口
    2 方式二:
        redis-cli -h 地址 -p 端口
       
    
    3 使用图形化客户端操作
    	-Redis Desktop Manager : 开源的,原来免费,后来收费  推荐用(mac, win,linxu 都有)
        -Qt5   qt是一个平台,专门用来做图形化界面的
        -可以使用 C++写
        -可以使用Python写  pyqt5  使用python写图形化界面(少量公司再用)
        -resp-2022.1.0.0.exe 一路下一步,安装完启动起来
      -Redis Client    小众
    
      图形化界面,连接redis 输入地址和端口 点击连接即可
  # redis默认有16个库,默认连进去就是第0个

2 Redis普通连接和连接池

# python 相当于客户端,操作redis
# 安装模块: pip install redis


# 补充: django 中操作mysql,没有连接池的 一个请求就是一个mysql连接

	-可能会有问题,并发数过高,导致mysql连接数过高,影响Mysql性能
    -使用django连接池:
  https://blog.51cto.com/liangdongchang/5140039  

2.2 连接池连接

###pool.py
import redis
POOL = redis.ConnectionPool(max_connections=10,host='127.0.0.1',port=6379)  # 创建一个大小为10的redis连接池


### 测试代码
import redis
from threading import Thread
from pool import POOL
def task():
    # 做成模块后,导入,无论导入多少次,导入的都算那一个POOL对象
    conn = redis.Redis(connection_pool=POOL) # 报错的原因是拿连接,池里不够了 没有等待,线程报错 设置等待,参数
    print(conn.get('name'))

for i in range(1000):
    t = Thread(target=task) # 每次都是一个新的连接,会导致 连接数过多
    t.start()
 

2.3 单例模式:设计模式

导入的6种方式(具体使用会重新开博客总结)

# 1. 模块导入
	其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。

# 2. 使用装饰器

# 3. 使用类

# 4. 基于__new__方法实现

# 5.  基于metaclass方法实现

3 Redis之字符串类型

# redis 是key-value形式存储
# redis 数据存放在内存中,如果断电,数据丢失--->需要有持久化的方案

# 5中数据类型 ,value类型
	-字符串: 用的最多,做缓存:做计数器
    -列表:  简单的消息队列
    -字典(hash): 缓存
    -集合: 去重
    -有序集合: 排行榜

字符串类型使用

'''
1 set(name, value, ex=None, px=None, nx=False, xx=False)
2 setnx(name, value)
3 setex(name, value, time)
4 psetex(name, time_ms, value)
5 mset(*args, **kwargs)
6 get(name)
7 mget(keys, *args)
8 getset(name, value)
9 getrange(key, start, end)
10 setrange(name, offset, value)
11 setbit(name, offset, value)
12 getbit(name, offset)
13 bitcount(key, start=None, end=None)
14 bitop(operation, dest, *keys)
15 strlen(name)
16 incr(self, name, amount=1)
# incrby
17 incrbyfloat(self, name, amount=1.0)
18 decr(self, name, amount=1)
19 append(key, value)
'''

import redis

conn = redis.Redis()

1 set(name, value, ex=None, px=None, nx=False, xx=False)
# ex:过期时间(秒)
# px:过期时间(毫秒)
# nx, 如果设置为True,则只有name不存在。当前set操作才执行,值存在,就修改不了,执行没效果
# xx, 如果设置为True,则只有name存在的时候,当前set操作才执行,值存在才能修改,值不存在 不会设置新值

conn.set('hobby','篮球', ex=6) 
# 创建k值 hobby  v:篮球 6秒之后过期
conn.set('hobby','篮球', px=6)
# 创建k值 hobby  v:篮球 6毫秒之后过期
conn.set('name','wei',nx=True)
# 执行没有效果 因为值存在
conn.set('name','lqz',nx=False)
# 更改成功 value值变成 lqz

conn.set('hobby','篮球',xx=True)  # 执行没效果
conn.set('hobby','篮球',xx=False)  # 有效果
# xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值

# redis---》实现分布式锁,底层基于nx实现的

2 setnx(name, value)
# 等同于:conn.set('name','lqz',nx=True)
conn.setnx('name', '刘亦菲')  #有值不会修改 

3 setex(name, value, time)
# 等同于:conn.set('name','lqz',ex=3)
conn.setex('wife', 3, '刘亦菲')
# 源码:setex(self, name: KeyT, time: ExpiryT, value: EncodableT)  过期时间放在中间

4 psetex(name, time_ms, value)
conn.psetex('wife',3000,'刘亦菲')  # 毫秒

5 mset(*agrs, **kwargs)
conn.mset({'wife':'刘亦菲','hobby':'篮球','job':'码农'}) # 一次性可以创建多个

6 get(name)
print(str(conn.get('wife'),encoding='utf-8'))
print(conn.get('wife'))  # b'\xe5\x88\x98\xe4\xba\xa6\xe8\x8f\xb2'

7 mget(keys, *args)  # 多次取值
 res=conn.mget('wife','hobby')
 res=conn.mget(['wife','hobby'])

8 getset(name, value)  # 取name对应的值 然后修改放入
 res=conn.getset('wife','迪丽热巴')
 print(res)  # 刘亦菲

9 getrange(key, start, end)
res = str(conn.getrange('wife', 0, 2), encoding='utf-8') # 字节长度 不是字符长度,前闭后闭区间
print(res)

10 setrange(name, offset, value)
conn.setrange('wife',2,'bbb') # 把 wife的值第二个字节修改成bbb  wwweeeiii  ----> wwbbbeiii

# ---- 比特位---操作 后面讲
 11 setbit(name, offset, value)
 12 getbit(name, offset)
 13 bitcount(key, start=None, end=None)
# ---- 比特位---操作

14 bitop(operation, dest, *keys)   获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值

15 strlen(name)
res = conn.strlen('hobby') # 统计字节长度 篮球 6
print(res)

16 incr(self, name, amount=1)
# 自增, 不会出并发安全问题,单线程架构,并发量高
conn.incr('age')
# # incrby

17 incrbyfloat(self, name, amount=1.0)
# conn.incrbyfloat('age',1.2)   可以小数自增 但是精度有小问题

18 derc(self, name, amount=1)
conn.decrby('age')
conn.decrby('age',-1)  # 负负得正 自增1

19 append(key, value)
conn.append('hobby','sb')

print(conn.strlen('hobby'))

conn.close()

'''
你需要记住的
set
get
strlen  字节长度
incr
'''

标签:01,name,基础,redis,value,set,Redis,conn
From: https://www.cnblogs.com/wei0919/p/17189737.html

相关文章

  • 【LeetCode回溯算法#01】图解组合问题
    组合问题力扣题目链接(opensnewwindow)给定两个整数n和k,返回范围[1,n]中所有可能的k个数的组合。示例:输入:n=4,k=2输出:[[2,4],[3,4],[2,3],[1......
  • 《SQL基础》16. 锁
    目录锁全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁临键锁锁锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争......
  • redis-redis介绍与安装、连接池、数据类型
    1.介绍和安装1.介绍:缓存数据库(大部分时间做缓存,不仅仅可以做缓存),非关系型数据库(区别于mysql关系型数据库)。原来从mysql中查的数据,现在可以从Redis中查,可以提高效率。......
  • 【Azure Redis 缓存】使用StackExchange.Redis,偶发ERROR - Timeout performing HSET
    问题描述使用StackExchange.Redis作为Redis客户端SDK,连接AzureRedis服务,长期运行后发现,每天都偶发TimeoutError。错误消息如下: StackExchange.Redis.RedisTimeou......
  • Java基础
    Java基础注释平时我们编写代码,在代码量比较少的时候,我们还可以看懂自己写的,但是当项目结构一旦复杂起来,我们就需要用到注释了。注释并不会被执行,是给我们写代码的人......
  • 缓存数据库redis 及各种value数据类型的使用
    Redis介绍与安装redis:缓存数据库(大部分时间做缓存,不仅仅可以做缓存),非关系型数据库【区别与mysql关系型数据库】nosql:非关系型数据库c语言写的服务(监听端口)......
  • XSS跨站基础小总结
    原理、分类和其他XSS跨站脚本攻击指恶意攻击者在Web页面中插入恶意javascript代码(也可能包含html代码),当用户浏览网页之时,嵌入Web里面的javascript代码会被执行,从而达到恶......
  • PAT 甲级 1011 World Cup Betting(20)
    Withthe2010FIFAWorldCuprunning,footballfanstheworldoverwerebecomingincreasinglyexcitedasthebestplayersfromthebestteamsdoingbattlesfor......
  • Linux基础
    常用命令(1)ctrlc:取消命令,并且换行(2)ctrlu:清空本行命令(3)tab键:可以补全命令和文件名,如果补全不了快速按两下tab键,可以显示备选选项(4)ls:列出当......
  • 路飞-day8——前端登陆注册页面、redis介绍与安装、redis普通连接与连接池、redis之字
    目录一、前端登录注册页面1.1分析1.2登陆组件多方式登录短信登录1.3注册组件1.4代码展示Login.vueRegister.vueHeader.vue二、Redis介绍与安装三、Redis普通连接和连接池5.......