掌握Redis,看完这篇文章就够了

news2024/7/4 4:43:58

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、Redis是什么?
  • 二、Redis安装
  • 三、Redis相关
    • 数据类型
  • 四、基础操作(使用了python连接redis)
    • 1.字符串
    • 2.键对应操作
    • 3.哈希(hash)
      • 结构
      • 操作
    • 4.集合
    • 5.有序集合
    • 6.列表
  • 总结


前言

Redis是一个性能卓越、功能丰富的键值存储系统,适用于各种不同的应用场景,本文就介绍了Redis的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Redis是什么?

Redis (Remote Dictionary Server) 是一个开源的高性能、非关系型数据库管理系统,属于键值存储系统。它支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等,并提供了丰富的操作命令,可以满足各种不同的应用需求。

Redis具有以下特点:

  1. 内存存储:Redis是将所有数据存储在内存中,因此读写速度非常快。同时,Redis也可以将数据持久化到硬盘上,以保证数据的持久性。

  2. 高性能:Redis采用C语言编写,并且使用了自己开发的数据结构和算法,使得它在处理大量并发请求时表现出色,能够实现高性能的读写操作。

  3. 多种数据结构支持:Redis支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。每种数据结构都有相应的操作命令,方便开发者进行数据的存储和操作。

  4. 发布订阅功能:Redis支持发布订阅模式,可以将消息发布给多个订阅者,实现消息的广播功能。

  5. 支持事务操作:Redis支持事务操作,可以将多个操作打包成一个事务进行执行,并且保证事务的原子性。

  6. 分布式存储:Redis支持数据的分布式存储,可以将数据分散存储在多个节点上,提高系统的整体性能和可扩展性。

总结起来,Redis是一个性能卓越、功能丰富的键值存储系统,适用于各种不同的应用场景,例如缓存、排行榜、实时统计等。它简单易用,具有高可用性、高性能和可扩展性,成为开发者们常用的数据存储解决方案之一。

二、Redis安装

双击安装包,一直next下去,在下方页面可以更改安装地址和配置环境变量,安装地址更不更改看个人喜好,文件不大,可以不改(我这里更改到了E盘,因为本宫喜欢),千万不要忘了将添加环境变量的选项勾选上,否则就要自己配置环境变量了。

在这里插入图片描述

下方页面中6379是端口号,选项是在防火墙中添加一个通道供Redis使用。

  • 扩展:
  • MySQL端口号:3306
  • MongoDB端口号:27017
  • Redis端口号:6379

在这里插入图片描述

后面的默认就好。
安装后 win+r 打卡命令行终端输入redis-cli,出现下方界面表示安装成功。
在这里插入图片描述

三、Redis相关

Redis:是一个键值存储数据库,类似字典

  • 内存数据库:
    MySQL、MongoDB都是以文件的形式存储在磁盘里
    Redis数据在内存中,操作内存的速度远远高于磁盘,并且Redis数据最终也可以存储在磁盘上

  • Redis服务器与客户端
    启动服务器:redis-server 配置文件:redis.windows.conf

数据类型

  • 字符串

  • 哈希:存储键值对

  • 列表:存储多个数据

  • 集合:无序、不重复

  • 有序集合:按照分数(权重)进行排序

  • 数据库相关
    默认使用db0(第一个数据库)
    keys *:所有的键

在这里插入图片描述

四、基础操作(使用了python连接redis)

  • 导入模块:import redis

  • 构建连接:redis.StrictRedis()

  • 关闭连接:client.close()

提示:下面的内容均是在python中运行的,与在终端中运行是不一样的

1.字符串

  • set(k, b):设置单个

  • get(k):获取单个

  • mset({字符串1:值, 字符串2:值, …}):添加多个字符串
    例子:r = client.mset({“s3”: “s33”, “s4”: “s44”, “s5”: “s55”}) # 在s3中添加s33,在s4中添加s44,在s5中添加s55

  • mget(k,k,k,k):获取多个字符串中的元素

  • incr(字符串):加1,例如:在代码中s6从100变为101

  • incrby(字符串,增量):在原有字符串上增加

  • decr:减1

  • decrby:减 增量

  • setex(k,time,v):设置带有有效期的

  • setnx(k,v):不存在就插入,不会覆盖

  • append(k,v):在原始数据后面拼接

  • delete(k):删除指定元素,返回 1、0
    1:删除成功
    0:没有删除成功

  • strlen(k):获取指定键的值长度

# 导入模块
import redis

# 构建连接
client = redis.StrictRedis()


# 操作

# 数字类型   字符串
# 添加单个字符串
r = client.set("s2", "hello s2!!")
print(r)  # True

# 获取单个元素
r = client.get("s2")
print(r, type(r))  # b'hello s2!!' <class 'bytes'>

# 添加多个字符串
# mset({字符串1:值, 字符串2:值, ...})
r = client.mset({"s3": "s33", "s4": "s44", "s5": "s55"})
# 在s3中添加s33,在s4中添加s44,在s5中添加s55
print(r)  # True

# 获取多个字符串中的元素
r = client.mget(["s3", "s4", "s5"])
print(r)  # [b's33', b's44', b's55']


r = client.set("s6", "100")
print(r)  # True

# incr转换并加1
r = client.incr("s6")
print(r)  # 101
# 增指定的量
r = client.incrby("s6", 10)
print(r) # 111

# decr转换并-1
r = client.decr("s6")
print(r)  # 110
# decrby(字符串, 减量)
r = client.decrby("s6", 10)
print(r)  # 100

# 设置带有有效期的
r = client.setex("s7", 10, "s777")
print(r)  # True

# 删除指定元素
r = client.delete("s6")
print(r)  # 1 ==》 删除成功

# append(k,v):在原始数据后面拼接,返回当前字符串的长度
r = client.append("s5", "77777")
print(r)  # 8

# 获取指定键的值长度:strlen(k)
r = client.strlen("s5")
print(r)  # 8

# 不存在就插入,不会覆盖
r = client.setnx("s44", "s4")
print(r)  # True


# 释放连接
client.close()

2.键对应操作

  • keys():返回所有键

  • exists(k):查看键是否存在

  • type(k):查看键对应值的类型

  • expire(k,time):设置有效期

  • ttl(k):查看剩余时间

  • delete(k):删除键

# 导入模块
import redis

# 构建连接
client = redis.StrictRedis()



# 键相关操作
# 判断键是否存在,返回0、1
# 存在:1   ; 不存在:0
r = client.exists("s33")
print(r)  # 0

# 设置有效期:expire(k,time),以秒为单位
r = client.expire("s3", 50)
print(r)  # True

# 查看剩余时间
r = client.ttl("s3")
print(r)  # 50

# 查看键对应值的类型
r = client.type("s3")
print(r)  # b'string'

# 查看数据中所有的键
r = client.keys()
print(r)  # [b'h2', b's44', b's4', b'set1', b'set5', ...

# 查看键对应的类型
r = client.type("s2")
print(r)  # b'string'



# 释放连接
client.close()

3.哈希(hash)

结构

  • 键(redis键)

  • 字段(hash的键)

  • 值(hash的值)

操作

  • hset(name,key,value):添加键值对

  • hget(name,key):获取对应的键

  • hmget(name,[key]):获取列表中字段对应的值

  • hmset(name,{}):添加多个键值对

  • hincrby(name,key,value):字段的值增加增量,返回增加后的值

  • hexists(name,key):判断字段是否存在

  • hgetall(name):所有字段与值

  • hkeys(name):所有字段

  • hvals(name):所有字段的值

  • hdel(name,key):删除字段,1:删除成功

  • hlen(name,key):返回字段长度

# 导入模块
import redis

# 构建连接
client = redis.StrictRedis()

# 哈希
print("***** 哈希 *****")
# 键(redis键)
# 字段(hash的键)
# 值(hash的值)

# 添加键值对:hset(name,key,value)
# 添加成功返回1
r = client.hset("h2", "k11", "v1111")
print(r)  # 1

# 获取对应的键:hget(name,key)
r = client.hget("h2", "k1")
print(r)  # b'v1'
#
# hmset要被废弃了,建议使用hset
# 添加键值对
r = client.hmset("h2", {"k2": "v2", "k3": "v3"})
print(r)  # True

# 获取列表中字段对应的值:hmget(name,[key])
r = client.hmget("h2", ["k2", "k3", "k1", "k11"])
print(r)  # [b'v2', b'v3', None, b'v1111']


r = client.hset("h2", "k4", "100")
print(r)  # 1

# hincrby(name,key,value):将字段的值增加增量,返回增加后的值
# 正量
r = client.hincrby("h2", "k4", 100)
print(r)  # 200
r = client.hget("h2", "k4")
print(r)  # b'200'
# 负量
r = client.hincrby("h2", "k4", -100)
print(r)  # 100
r = client.hget("h2", "k4")
print(r)  # b'100'


# 判断字段是否存在
r = client.hexists("h2", "k4")
print(r)  # True
# hdel(name,key):删除字段,1:删除成功
r = client.hdel("h2", "k4")
print(r)  # 1
r = client.hexists("h2", "k4")
print(r)  # False


# 释放连接
client.close()

4.集合

  • sadd(key,value,value,value):添加,需要指定键,返回成功插入的个数
    例子:r = client.sadd(“set2”, 100, 200, 300, 300 )

  • smembers(key): 获取所有元素

  • sismember(key,value):判断value是否在集合中

  • scard(key):总个数

  • srem(key,value):移除指定元素,返回移除的个数

  • spop(key):随机删除,返回移除的元素

  • srandmember(key,个数):随机获取集合中的元素

  • sinter( [ key1,key2 ] ):交集,放入的是集合列表

  • sunion( [ key1,key2 ] ):并集,放入的是集合列表

  • sdiff( [ key1,key2 ] ):差集,放入的是集合列表

  • sinterstore(new_key, [ key1,key2 ] ):合并交集 (新集合),返回个数

  • sunionstore(new_key, [ key1,key2 ] ):合并并集 (新集合),返回个数

  • sdiffstore(new_key, [ key1,key2 ] ):合并差集 (新集合),返回个数

# 导入模块
import redis

# 构建连接
client = redis.StrictRedis()

# 集合
print("********* 集合 *********")
# 添加,需要指定键,返回成功插入的个数
r = client.sadd("set2", 100, 200, 300, 300, 100)
print(r)  # 3

# 获取所有元素
r = client.smembers("set2")
print(r)  # {b'100', b'300', b'200'}

# 判断value是否在集合中
r = client.sismember("set2", "100")
print(r)  # 1

# 总个数
r = client.scard("set2")
print(r)  # 3

# 移除指定元素,返回移除的个数
r = client.srem("set2", "200")
print(r)  # 1
r = client.smembers("set2")
print(r)  # {b'100', b'300'}

# 随机删除,返回移除的元素
r = client.sadd("set2", 450, 600, 780, 550, 450, 600)
print(r)  # 4
r = client.spop("set2")
print(r)  # b'450'

# 随机获取集合中的元素  2个
r = client.srandmember("set2", 2)
print(r)  # [b'100', b'550']


# 第二个集合
r = client.sadd("set3", 400, 500, 450, 300)
print(r)  # 4
# 交集
r = client.sinter(["set2", "set3"])
print(r)  # {b'300'}
# 并集
r = client.sunion(["set2", "set3"])
print(r)  # {b'500', b'600', b'100', b'300', b'450', b'400', b'550', b'780'}
# 差集
r = client.sdiff(["set2", "set3"])
print(r)  # {b'100', b'550', b'600', b'780'}


# 合并交集,返回个数
r = client.sinterstore("set4", ["set2", "set3"])
print(r)  # 个数  # 1
r = client.smembers("set4")
print(r)  # {b'300'}

# 合并并集,返回个数
r = client.sunionstore("set5", ["set2", "set3"])
print(r)  # 个数  # 8
r = client.smembers("set5")
print(r)  # {b'500', b'600', b'100', b'300', b'450', b'400', b'550', b'780'}

# 合并差集,返回个数
r = client.sdiffstore("set4", ["set2", "set3"])
print(r)  # 个数  # 4
r = client.smembers("set4")
print(r)  # {b'100', b'550', b'600', b'780'}


# 释放连接
client.close()

5.有序集合

  • zadd(“集合”, {值: 权重}):添加带有权重的元素,返回个数
    例子:r = client.zadd(“zset2”, {“v1”: 10, “v2”: 5 } )

  • zrem(集合, 值, 值, …):移除指定元素,返回移除的个数
    例子:r = client.zrem(“zset2”, “v1”, “v2”)

  • 按照索引范围获取元素,withscores判断输出是否需要带权重
    正序: zrange(集合, min索引, max索引, withscores=True)

      		例子:r = client.zrange("zset2", 0, 5, withscores=True)
      		结果:[(b'v4', 20.0), (b'v3', 30.0), (b'v6', 40.0), (b'v5', 50.0)]
    

    逆序 :zrevrange(集合, min索引, max索引, withscores=True)

      		例子:r = client.zrevrange("zset2", 0, 5, withscores=True)
      		结果:[(b'v5', 50.0), (b'v6', 40.0), (b'v3', 30.0), (b'v4', 20.0)]
    
  • 按照权重范围获取元素
    正序:zrangebyscore(集合, min权重, max权重, withscores=True)

    逆序:zrangebyscore(集合, max权重, min权重, withscores=True)

  • zcard(集合): 总个数

  • zcount(集合, min, max):权重在min到max之间元素的个数
    例子:r = client.zcount(“zset2”, 10, 100)

  • zscore(集合, value):获取value对应的权重

  • zincrby(集合, 增量, 值):增加权重,返回增加好的权重
    例子:r = client.zincrby(“zset2”, 50, “v5”) # 向zset2中v5的权重增加50 结果:50
    zinterstore(新集合, [集合1, 集合2, …]):合并交集,返回个数

# 导入模块
import redis

# 构建连接
client = redis.StrictRedis()


# 有序集合:通过分数(权重)实现有序
# 添加带有权重的元素:zadd("集合", {值: 权重}),返回个数
r = client.zadd("zset2", {"v1": 10, "v2": 5, "v3": 30, "v4": 20, "v5": 50, "v6": 40})
print(r)  # 6

# 移除指定元素,返回移除的个数:zrem(集合, 值, 值, ....)
r = client.zrem("zset2", "v1", "v2")
print(r)  # 2

# 按照索引范围获取元素(正序),withscores判断输出是否需要带权重
# zrange(集合, min索引, max索引, withscores=True)
r = client.zrange("zset2", 0, 5, withscores=True)
print(r)  # [(b'v4', 20.0), (b'v3', 30.0), (b'v6', 40.0), (b'v5', 50.0)]
# 同上,只不过是逆序按照索引获取元素
r = client.zrevrange("zset2", 0, 5, withscores=True)
print(r)  # [(b'v5', 50.0), (b'v6', 40.0), (b'v3', 30.0), (b'v4', 20.0)]

# 按照权重范围获取元素(正序):zrangebyscore(集合, min权重, max权重, withscores=True)
r = client.zrangebyscore("zset2", 0, 100, withscores=True)
print(r)  # [(b'v4', 20.0), (b'v3', 30.0), (b'v6', 40.0), (b'v5', 50.0)]
# 逆序:zrangebyscore(集合, max权重, min权重, withscores=True)
r = client.zrevrangebyscore("zset2", 100, 0, withscores=True)
print(r)  # [(b'v5', 50.0), (b'v6', 40.0), (b'v3', 30.0), (b'v4', 20.0)]

# 总个数
r = client.zcard("zset2")
print(r)  # 4

# 权重在min到max之间元素的个数:zcount(集合, min, max)
r = client.zcount("zset2", 10, 100)
print(r)  # 4

# 获取value对应的权重:zscore(集合, value)
r = client.zscore("zset2", "v5")
print(r)  # 50.0

# 增加权重,返回增加好的权重:zincrby(集合, 增量, 值)
r = client.zincrby("zset2", 50, "v5")  # 向zset2中v5的权重增加50
print(r)  # 100.0

r = client.zadd("zset3", {"v5": 500, "v6": 400, "v7": 300, "v8": 40, "v9": 50})
print(r)
# 交集:zinterstore(新集合, [集合1, 集合2, ....]),返回个数
r = client.zinterstore("zset4", ["zset2", "zset3"])
print(r)  # 2


# 释放连接
client.close()

6.列表

  • 插入,返回当前列表的个数
    在向当前列表的左边:lpush(列表, 值,值,…)

      		例子:r = client.lpush("l2", 1, 2, 3, 4, 5)
    

    在向当前列表的右边插入:rpush(列表, 值,值,…)

      		例子:r = client.rpush("l2", 0, -1, -2, -3)
    
  • 末尾删除,返回删除的元素
    左边删除:lpop(列表)
    右边删除:rpop(列表)

  • 修改:lset(列表, 位置, 修改的值)
    例子:r = client.lset(“l2”, 0, “30”) # 将l2中0的位置上的元素修改为30

  • 插入元素,返回当前列表的个数:linsert(列表, “before/after”, 参考位置, 插入的值)

      r = client.linsert("l2", "before", "0", "0.5")
      		# l2中在0的前面插入0.5
      	r = client.linsert("l2", "after", "0", "-0.5")
      		# l2中在0的后面插入-0.5
    
  • 删除对应数量的值,返回删除的个数: lrem(“l2”, 数量, 值)

      	例子:r = client.lrem("l2", 2, "-30")  # 在l2中删除2个-30
    
  • 保留列表指定范围内的元素,删除其他元素:ltrim(列表, start, end)
    r = client.ltrim(“l2”, 2, 4)

  • 获取指定范围的元素:lrange(“l2”, start位置, end位置)
    r = client.lrange(“l2”, 0, 100)

  • 获取对应位置的元素:lindex(列表, 位置)

# 导入模块
import redis

# 构建连接
client = redis.StrictRedis()


# 列表
# 插入(在向当前列表的左边),返回当前列表的个数
# lpush(列表, 值,值,...)
r = client.lpush("l2", 1, 2, 3, 4, 5)
print(r)  # 5
# 在向当前列表的右边插入
# rpush(列表, 值,值,...)
r = client.rpush("l2", 0, -1, -2, -3)
print(r)  # 9

# 末尾删除,返回删除的元素
# 左边删除
# lpop(列表)
r = client.lpop("l2")
print(r)  # b'5'
# 右边删除
# rpop(列表)
r = client.rpop("l2")
print(r)  # b'-3'

# 修改:lset(列表, 位置, 修改的值)
r = client.lset("l2", 0, "30")  # 将l2中0的位置上的元素修改为30
print(r)  # True

# 插入元素,返回当前列表的个数
# linsert(列表, "before/after", "0"参考位置, 插入的值)
# l2中在0的前面插入0.5
r = client.linsert("l2", "before", "0", "0.5")
print(r)  # 8
# l2中在0的后面插入-0.5
r = client.linsert("l2", "after", "0", "-0.5")
print(r)  # 9

# 删除对应数量的值,返回删除的个数:lrem("l2", 数量, 值)
r = client.lrem("l2", 2, "-30")  # 在l2中删除2个-30
print(r)  # 2

# 保留列表指定范围内的元素,删除其他元素:ltrim(列表, start, end)
r = client.ltrim("l2", 2, 4)
print(r)  # True

# 获取指定范围的元素:lrange("l2", start位置, end位置)
r = client.lrange("l2", 0, 100)
print(r)  # [b'3', b'2', b'1']

# 获取对应位置的元素:lindex(列表, 位置)
r = client.lindex("l2", 5)
print(r)  # None


# 释放连接
client.close()

总结

以上就是今天要讲的内容,本文介绍了redis的基础使用,而它具有快速的读写能力、灵活的数据模型和丰富的功能,愿每个人的心灵都能如同一座富饶的花园,种下智慧的种子,在岁月的浇灌下开出收获的芬芳。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1511131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实时查询银行卡归属地的API接口,快速获取卡片发卡地信息

快速查询银行卡发卡地信息是一项非常实用的功能&#xff0c;对于进行业务合作、风险评估等方面都有很大的帮助。在本文中&#xff0c;我们将介绍一个实时查询银行卡归属地的API接口&#xff0c;并提供相应的代码示例。 该API接口可以通过输入银行卡号&#xff0c;查询该卡片的…

Tictoc3例子

在tictoc3中&#xff0c;实现了让 tic 和 toc 这两个简单模块之间传递消息&#xff0c;传递十次后结束仿真。 首先来介绍一下程序中用到的两个函数&#xff1a; 1.omnetpp中获取模块名称的函数 virtual const char *getName() const override {return name ? name : "&q…

Rust 安装与版本更新

Rust 简介 Rust &#xff0c;一门赋予每个人构建可靠且高效软件能力的语言&#xff0c;主打内存安全。 2024年2月&#xff0c;在一份 19 页的报告《回归基础构件&#xff1a;通往安全软件之路》中&#xff0c;白宫国家网络主任办公室&#xff08;ONCD&#xff09;呼吁开发者使…

linux ,Windows部署

Linux部署 准备好虚拟机 连接好查看版本&#xff1a;java -version安装jdk 解压命令&#xff1a;tar -zxvf 加jdk的压缩文件名cd /etc 在编辑vim profile文件 在最底下写入&#xff1a; export JAVA_HOME/root/soft/jdk1.8.0_151&#xff08;跟自己的jdk保持一致&#xff0…

【网站项目】012医院住院管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Matlab中安装mltbx工具箱文件

准备 前提就是要已经下载好了相应的mltbx格式的工具箱文件 一般来说可以直接在开源的Github上下到相应的文件&#xff0c;这里以VeriStand Model Generation Support MATLAB add-on为例 注&#xff1a; 一般来说你可以下载到的文件有两种&#xff1a; Source Code &#xff…

实体店新模式探索:实体店如何转型与引流新策略

随着互联网的迅猛发展&#xff0c;线上购物逐渐成为了人们消费的主流方式。然而&#xff0c;实体店作为传统零售业的代表&#xff0c;依然具有其独特的价值和优势。 为了在这个变革的时代中保持竞争力&#xff0c;实体店必须积极探索新的模式&#xff0c;实现转型与引流。 作…

归并排序 刷题笔记

归并排序的写法 归并排序 分治双指针 1.定义一个mid if(l>r)return ; 2.分治 sort(q,l,mid); sort(q,mid1,r); 3. 双指针 int il,jmid,k0; 将双序列扫入 缓存数组 条件 while(i<mid&&j<r) 两个数列比较大小 小的一方 进入缓存数组 4. 扫尾 while(…

OpenHarmony教程指南—ArkTS时钟

简单时钟 介绍 本示例通过使用ohos.display 接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 使用说明 1.界面通过setInterval实现周期性实时刷新时间&#xff0c;使用Canvas绘制时钟&#xff0c;指针旋转角度通过计算得出。 例如&#xff1a;"2 * Math.PI /…

MyBatis 实现复杂查询

#{ } 与 ${ } 的区别(重点) #{ } 与 ${ } 在MyBatis中都是用于替换SQL参数的, 主要以下几点不同: 方式不同: ${ } 是直接替换为传递的参数, #{ } 则是先预处理,然后再设置参数 安全性不同: ${ } 存在SQL注入的风险, #{ }则不存在安全问题使用场景不同: …

【GO】HTTP标准库1 - http协议基础知识

目录 一 http协议 1 http协议 2 http request 3 请求方法 4 URL 5 协议版本 6 请求头 7 Content-type 9 POST与GET区别 10 HTTP Response 11 常见的状态与话术 12 HTTP 响应头 13 完整的HTTP响应 14 HTTPS 一 http协议 1 http协议 HTTP&#xff08;HyperText Tra…

Python从0到100(四):Python中的运算符介绍

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

Centos7 安装postgresql14后无法连接数据库

1、数据库服务器允许外部访问5432端口。 2、postgresql.conf 3、pg_hba.conf a、制定某个IP&#xff08;192.168.0.107&#xff09;访问 b、指定ip段访问 允许10.1.1.0~10.1.1.255网段登录数据库 host all all 10.1.1.0/24 trust c、指定全网访问 host a…

盲盒抽卡机小程序——开启神秘之旅!

亲爱的朋友们&#xff0c;欢迎来到盲盒抽卡机小程序&#xff01;这里&#xff0c;是一个充满神秘与惊喜的世界&#xff0c;让你随时随地体验抽卡的乐趣。在这里&#xff0c;你可以轻松尝试各种盲盒&#xff0c;发现隐藏的宝藏&#xff0c;感受心跳加速的刺激。 【丰富多样的盲…

语音情感识别python项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 什么是语音情感识别&#xff1f; 语音情感识别&#xff0c;缩写为 SER&#xff0c;是试图从语音中识别人类情感和情感状态的行为。这是利用了这…

docker + nginx打包前端镜像

项目场景&#xff1a; 前端使用angular开发&#xff0c;Dockerfile如下&#xff1a; FROM nginx:1.16.1 AS base WORKDIR /app COPY nginx.conf.template /etc/nginx/ CMD ["/bin/bash", "-c", "envsubst ${APP_VERSION} < /app/index.html > …

Python环境安装及Selenium引入

Python环境安装 环境下载 Download Python | Python.org 环境安装 需使用管理员身份运行 查看环境是否安装成功 python --version 如果未成功则检查环境变量配置 安装 Selenium 库 pip install selenium Selenium 可以模拟用户在浏览器中的操作&#xff0c;如点击按钮、填写…

Vue3全家桶 - VueRouter - 【2】重定向路由

重定向路由 在路由规则数组中&#xff0c;可采用 redirect 来重定向到另一个地址&#xff1a; 通常是将 / 重定向到 某个页面&#xff1b; 示例展示&#xff1a; router/index.js&#xff1a;import { createRouter, createWebHashHistory, createWebHistory } from vue-route…

51单片机基础篇系列-中断系统处理过程中断编程

&#x1f308;个人主页:会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 80C51单片机中断处理过程 中断相应过程&#xff1a; 中断源有中断请求 此中断源的中断允许位为1 CPU开中断&#xff08;即EA-1&#xff09;.以上三条同时满足&#xff0c;CPU才有…

okcc呼叫中心外呼任务为何启动后会自动暂停?

OKCC呼叫中心系统是一套完整的呼叫中心与管理平台,为电话营销型企业专门设计的电销平台与客服平台。OKCC系统集电话营销功能与热线客服功能于一体,兼具呼入呼出功能。本呼叫中心支持独立的计费系统、话务系统、客户系统、工单管理系统,是一套完善的高效的呼叫中心系统 那我们在…