首页 > 数据库 >redis介绍和安装,redis普通链接和连接池,redis字符串类型,redis hash类型

redis介绍和安装,redis普通链接和连接池,redis字符串类型,redis hash类型

时间:2023-06-27 21:11:28浏览次数:40  
标签:hash name res redis value 连接池 key conn

1 Redis介绍和安装

# Redis :软件,存储数据的,速度非常快,redis是一个key-value存储系统(没有表的概念),cs架构的软件
	-服务端  客户端(python作为客户端,java,go,图形化界面,命令窗口的命令)
# es:存数据的地方

# 关系型数据库和非关系型数据库
	-关系型:mysql,PostgreSQL,oracle,sqlserver,db2
    	-PG
        -去 IOE:国产化
        	-IBM---》浪潮信息,曙光,联想
            -Oracle---》数据----》达梦。。。。
            -EMC存储--》国产存储
    -非关系型数据库(nosql):redis(缓存),mongodb(json文档数据存储),es(大数据量存储)。。。。
    	-nosql 指非关系型数据库: no only sql,对关系型数据库的补充
        
# redis特点:
	-开源软件,存数据,cs架构
    -key-value存储 ,5大数据类型  value的类型是5种:字符串,hash(字典),列表,集合,有序集合
    -速度快:
    	-1 纯内存存储(核心)
        -2 使用了IO多路复用的网络模型
        -3 数据操作是单线程,避免了线程间切换,而且没有锁,也不会数据错乱
    -支持持久化
    	-纯内存,可以存到硬盘上,防止数据丢失
    -redis又被称之为 缓存数据库

1.1 安装redis

# redis 是用c语言编写的,需要在不同平台编译成可执行文件,才能在这个平台上运行
	-redis 使用了io多路复用种的epoll模型,win不支持epoll
    -redis官方,不支持win版本
    -微软官方,就把redis改动,编译成可执行,能运行在win上,滞后 3.x版本
    -第三方:5.x版本
    
# redis 官方网:https://redis.io/download/
# redis中文网:http://redis.cn
# win:3.x:https://github.com/microsoftarchive/redis/releases
# win:5.x:https://github.com/tporadowski/redis/releases/


# 安装:一路下一步
	-安装完成后,在安装路径下有
    	-redis-cli.exe     # mysql
        -redis-server.exe   # mysqld
        -redis.windows-service.conf  # my.ini
     -并且会自动做成服务
    	-服务的命令:redis-server.exe  redis.windows-service.conf
        
        
        
        
# 启动redis服务端
	-1 命令行中  redis 就可以启动服务
    -2 命令行中,启动服务,并指定配置文件
    	redis-server 配置文件路径
    -3 使用服务启动

# 客户端链接
	-1 命令行客户端:
    	-redis-cli  # 默认连本地的6379端口
        -redis-cli -p 6379 -h 127.0.0.1
    -2 图形化客户端链接
    	-1 最新版的Navicate支持链接redis了(收费的)
        -2 Redis Desktop Manager(https://resp.app/)  收费的  用的多  qt写图形化界面
        	-qt是个平台,做GUI[图形化界面]开发
            -用c写,用python写  pyqt5
            
    -3 python的模块
    	-pip install redis
        

2 redis普通链接和连接池

2.1 普通链接

from redis import Redis

# conn = Redis()  # 建立redis的链接
conn = Redis(host="127.0.0.1",
             port=6379,
             db=0,decode_responses=True)  # 建立redis的链接   decode_responses=True,查询回来返回的结果是字符串类型,否则是byte格式
res = conn.get('name')  # 获取key名为name的value值
print(res)
conn.close()  # 关闭链接

2.2 连接池链接

# 一定要保证,池是单例的,以模块导入的形式做成了单例,是python独有的,所有线程共用一个连接池,而不是每个线程独有一个

# pool.py
import redis
POOL = redis.ConnectionPool(max_connections=1000,host='127.0.0.1',port=6379)

# 其它.py

import redis
from pool import POOL # 模块导入的方式, 天然单例
conn = redis.Redis(connection_pool=POOL)  # 以后拿到链接,是从POOL种取,如果没有可用的了,默认不阻塞,可以通过某个参数配置,设置阻塞等待
res = conn.get('name')  # 获取key名为name的value值
print(res)
conn.close()  # 关闭链接

image

3 redis字符串类型

# https://www.cnblogs.com/liuqingzheng/articles/9833534.html

'''
1 set(name, value, ex=None, px=None, nx=False, xx=False)
2 setnx(name, value)
3 psetex(name, time_ms, value)
4 mset(*args, **kwargs)
5 get(name)
6 mget(keys, *args)
7 getset(name, value)
8 getrange(key, start, end)
9 setrange(name, offset, value)
10 setbit(name, offset, value)
11 getbit(name, offset)
12 bitcount(key, start=None, end=None)
13 bitop(operation, dest, *keys)
14 strlen(name)
15 incr(self, name, amount=1)
16 incrbyfloat(self, name, amount=1.0)
17 decr(self, name, amount=1)
18 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不存在则添加,存在无效果
# xx,如果设置为True,name存在则修改,不存在无效果
 conn.set('hobby', '篮球', ex=6)
 conn.set('hobby', '篮球', px=3000)
 conn.set('hobby', '足球', nx=True)
 conn.set('hobby', '足球', xx=True)

 2 setnx(name, value)
 conn.setnx('hobby1', '乒乓球')  
    # 等同于conn.set('hobby', '足球', nx=True)

 3 psetex(name, time_ms, value)
 conn.psetex('name',3000,'xxx')  #px
    
    setex(name, value, time)
  conn.psetex('name',3000,'xxx')    #ex

 4 mset(*args, **kwargs)
 conn.mset({'name': "lqz", 'height': 183})  
    # 一次性设置多个键值对,跟一次次设置的区别是,少了网络交互的时间

 5 get(name)
 res=conn.get('hobby')  
    # utf-8 编码,一个中文占3个字节    GBK 编码,一个中文占2个字节
# print(res)


 6 mget(keys, *args)
 res=conn.mget('name','age')  #批量取值
 res=conn.mget(['name','age'])
 print(res) 

 7 getset(name, value)
 res=conn.getset('name','彭于晏')
 print(res)
    
 8 getrange(key, start, end)
 res=conn.getrange('name',0,1)  # 前闭后闭区间,拿的是字节,不是字符
 print(res)

 9 setrange(name, offset, value)
 conn.setrange('name',2,'lqz')

 14 strlen(name)
 res=conn.strlen('name')  # 9 统计字节长度
 print(res)


 15 incr(self, name, amount=1)  # 做计数器。不会出现并非安全问题,每一次执行默认加1
 conn.incrby('height')

 16 incrbyfloat(self, name, amount=1.0)

 17 decrby(self, name, amount=1)
 conn.decrby('height',5) #减5


 18 append(key, value)
conn.append('name', 'xxxx')  #末尾添加

conn.close()


'''
get
set
strlen
append
'''

4 redis hash类型

# hash类型就是咱们python中的字典,key-value,字典又叫hash类型   字典的key必须可hash
	-字典类型在底层存储,基于数组存的
	key---{key:value,key:value}
    
conn = redis.Redis(decode_responses=True)
1 hset(name, key, value)
conn.hset('userinfo', 'name', '刘亦菲')
conn.hset('userinfo', 'age', '38')

2 hmset(name, mapping) # 弃用了,还能用
conn.hmset('userinfo2', {'name': "彭于晏", 'height': 183})
#批量添加
conn.hset('userinfo3', mapping={'name': "彭于晏123", 'height': 183})

3 hget(name,key)
res=conn.hget('userinfo','age')
print(res)

4 hmget(name, keys, *args)
res=conn.hmget('userinfo',['name','age'])
print(res)

5 hgetall(name)  # 慎用,如果hash中key非常的,可能会撑爆内存
#字典形式获取所有
res=conn.hgetall('userinfo')
print(res)

6 hlen(name)
#获取字段的个数
res=conn.hlen('userinfo')
print(res)
7 hkeys(name)
#获取所有key值
print(conn.hkeys('userinfo'))
8 hvals(name)
#获取所有value值
print(conn.hvals('userinfo'))
9 hexists(name, key)
#查看该key是否存在
print(conn.hexists('userinfo','name'))

10 hdel(name,*keys)
#删除键里面对应key的键值对
conn.hdel('userinfo2', 'name', 'height')


11 hincrby(name, key, amount=1)
#默认加1
conn.hincrby('userinfo3','height')
12 hincrbyfloat(name, key, amount=1.0)

13 他们是一家  #批量添加
for i in range(1000):
    conn.hset('hash_test', 'egg_%s' % i, '鸡蛋%s号' % i)


14 res=conn.hgetall('hash_test')
print(res)
15 hscan(name, cursor=0, match=None, count=None)  分批获取,获取多少个,约等于,它不单独用
res = conn.hscan('hash_test', cursor=0, count=20)
print(len(res[1]))

16 hscan_iter(name, match=None, count=None)  # 获取所有,但是分批获取
res=conn.hscan_iter('hash_test',count=10)  # 取出所有,每次拿10条,用完再取10条,直到取完,内部使用了hscan+生成器
for item in res:
    print(item)    
    

conn.close()    
'''
hset
hget
hlen
hexisit

'''

标签:hash,name,res,redis,value,连接池,key,conn
From: https://www.cnblogs.com/whxx/p/17509931.html

相关文章

  • Redis
    Redis介绍:redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原......
  • 「路飞项目09」redis
    1Redis介绍和安装#Redis:软件,存储数据的,速度非常快,redis是一个key-value存储系统(没有表的概念),cs架构的软件-服务端客户端(python作为客户端,java,go,图形化界面,命令窗口的命令)#es:存数据的地方#关系型数据库和非关系型数据库-关系型:mysql,PostgreSQL【PG】,oracle,sqlserver,db......
  • LeetCode C++:HashTable篇
    1、TwoSumGivenanarrayofintegersnums andanintegertarget,returnindicesofthetwonumberssuchthattheyadduptotarget.Youmayassumethateachinputwouldhaveexactlyonesolution,andyoumaynotusethesameelementtwice.Youcanreturn......
  • 局部敏感哈希LSH(SimHash与MinHash)
    SimHash1.算法思想假设我们有海量的文本数据,我们需要根据文本内容将它们进行去重。对于文本去重而言,目前有很多NLP相关的算法可以在很高精度上来解决,但是我们现在处理的是大数据维度上的文本去重,这就对算法的效率有着很高的要求。而局部敏感hash算法可以将原始的文本内容映射为......
  • ConcurrentHashMap并不是绝对线程安全的
    ConcurrentHashMap是线程安全的概念已经深入人心,让我们在使用的时候有些大意了,我也懒得动脑子,直接使用,结果碰到钉子了. 这个问题让我很郁闷,程序逻辑全是对的,但是问题却明明摆在那边,最后怀疑是HashMap的问题。 1.package2.3.import4.import5.import6.7.impor......
  • Java-hashcode与equals
    1.如果hashcode()不相同,两个对象一定不是同一个对象2.如果hashcode()相同,两个对象不一定上同一个对象,需要进一步判别equals3.如果equals相同,应当认为两个对象就是相同对象由于hashcode方法仅返回一个值,equals里面有若干逻辑,因此,部分集合类的判断中,会优先判断hashcode,如果相同再......
  • redis-分布式锁优化思路
    1.加锁的代码块,粒度越小越好,语句越少越好,更不容易出现"插队"的现象2.分段锁思路:以"超卖"为例,原本是待促销200件商品,一把锁,现改成10款20件商品的促销,改成10把锁,当并发小于10的时候,甚至都不需要锁,就可以并发安全......
  • redis-分布式锁样例
    redisTemplate:stringlockKey="product_101"stringclientID=UUID.randomUUID().toString()boolresult=redisTemplate.opsForValue().setIfAbsent(lockKey,clientID,10,TimeUnit.SECONDS)if(!result){return"error_code"}try{//业务逻辑......
  • python 批量删除 redis 大量数据
    #!/usr/bin/envpython#ScananddeletekeysinRedis.#Author:cdfivefromredisimportRedisimporttimedefRedisScanAndDelete(host,port,password,db,cursor,pattern,count,batch_delete_size):start_time=time.time()client=Redis(host......
  • Java使用redis-Redis是并发安全的吗?
    大家都清楚,Redis 是一个开源的高性能键值对存储系统,被开发者广泛应用于缓存、消息队列、排行榜、计数器等场景。由于其高效的读写性能和丰富的数据类型,Redis 受到了越来越多开发者的青睐。然而,在并发操作下,Redis 是否能够保证数据的一致性和安全性呢?接下来小岳将跟大家一起来探......