首页 > 数据库 >redis基础

redis基础

时间:2023-10-17 22:15:05浏览次数:31  
标签:name girls redis 基础 value print conn

一、介绍和安装

1、 redis 什么

-数据库就是个存数据的地方:只是不同数据库数据组织,存放形式不一样
	-mysql  关系型数据库(oracle,sqlserver,postgrasql)
    
  -非关系型数据(no sql):redis,mongodb,clickhouse,infludb,elasticsearch,hadoop。。。 -没有sql:没有sql语句 -not olny sql 不仅仅是sql -redis:一款纯内存存储的非关系型数据库(数据都在内存),速度非常快

2、redis特点

https://www.cnblogs.com/liuqingzheng/articles/9833534.html
	-redis是一个key-value存储系统
    -数据类型丰富,支持5大数据类型:字符串,列表,hash(字典),集合,有序集合
    -纯内存操作
    -可以持久化:能都把内存数据,保存到硬盘上永久存储

3、redis为什么这快

-1 纯内存,减少io
-2 使用了 io多路复用的 epoll 网络模型
-3 数据操作是单线程,避免了线程间切换
-多个客户端同时操作,不会存在并发安全问题

4、安装

-redis:最新是7,  公司里5,6比较多
	-redis:开源软件,免费的,他们不支持win
    	-epoll模型不支持win
    -微软官方:基于源码修改---》编译成可执行文件
    -第三方:https://github.com/tporadowski/redis/releases/
        
    -win:下载安装包,一路下一步
    	-安装目录在环境变量中:任意路径敲 redis-server   reidis-cli 都能找到
        -把redis做成了服务,以后通过服务启动即可
        
    -mac:官网下载,解压即可
    
    
    -win,mac:两个可执行文件:
        redis-server   :等同于 mysqld
        reidis-cli     :等同于mysql
        
        
 # 5 启动,连接
	# 5.1 启动方式
		-使用服务启动
        	redis-server redis.windows-service.conf
        -使用命令启动	
        	redis-server
    # 5.2 连接
    	redis-cli
        redis-cli -h 地址 -p 端口(默认端口6379)
	# 5.3 图形化客户端(Navicate)
    	-resp:后来收费了
        -连接上发现有16个库

二、py连接redis

1、普通连接

安装模块:pip install redis

from redis import Redis

conn = Redis(host="localhost",port=6379,db=0,decode_responses=True)

res=conn.get('name')

print(res)

conn.close()

2、连接池

import redis
from threading import Thread
from pool import POOL


def task():
    conn = redis.Redis(connection_pool=POOL)
    print(conn.get('name'))
    conn.close()


if __name__ == '__main__':
    for i in range(10):
        t = Thread(target=task)
        t.start()


###
pool.py
import redis
# 把池写成单例----》整个项目中,只有这一个实例(对象)---》python 中实现单例的5种方式---》模块导入的方式
POOL = redis.ConnectionPool(host='127.0.0.1', port=6379, max_connections=50)

三、redis数据类型

1、字符串类型

set、get、getrange、strlen

import redis

conn = redis.Redis(decode_responses=True)
# 1 set(name, value, ex=None, px=None, nx=False, xx=False)
# conn.set('age','19') # 没有就新增,有值就修改
# conn.set('hobby','篮球',ex=5) # ex过期时间 秒
# conn.set('hobby','篮球',px=5000)# 过期时间,毫秒
# conn.set('name','彭于晏')
# conn.set('name', 'lqz', nx=True)  # nx,如果设置为True,则只有name不存在时,当前set操作才执行,值存在,就修改不了,执行没效果
# conn.set('name', 'lqz', xx=True)  # 如果设置为True,则只有name存在时,当前set操作才执行,key值存在才能修改,值不存在,



# 2 setnx(name, value)
# conn.setnx('name','彭于晏')

# 3 setex(name, value, time)
# conn.setex('name',5,'sdasdfs')

# 4 psetex(name, time_ms, value)
# conn.psetex('name',5000,'lqz')


# 5 mset(*args, **kwargs)  批量设置
# conn.mset({'name': 'lqz', 'age': 29, 'gender': '男'})

# 6 get(name)
# print(conn.get('name'))

# 7 mget(keys, *args)
# print(conn.mget(['name','age']))
# print(conn.mget('name','age','gender'))

# 8 getset(name, value)  # 等同于  get   set
# print(conn.getset('name','oooo'))

# 9 getrange(key, start, end)
# print(conn.getrange('name',1,3))  # 前闭后闭区间

# 10 setrange(name, offset, value)
# conn.setrange('name',2,'ooo') # 从2开始包含2,修改字母为ooo

# 先不聊---》操作比特位---》后面聊
# 11 setbit(name, offset, value)
# conn.setbit('name',7,1)  # l=[1 1 0 0 0 1 0 0 ]
# 12 getbit(name, offset)
# 13 bitcount(key, start=None, end=None)
# 14 bitop(operation, dest, *keys)


# 15 strlen(name)
# print(conn.strlen('name'))

# 16 incr(self, name, amount=1)
# conn.incr('age',2) # 自加1,单线程,没有并发安全,数据不会错乱,天然适合计数器  计数器---》日活(日活跃用户数,只要有用户登录,就+1)
# # incrby

# 17 incrbyfloat(self, name, amount=1.0)
# conn.incrbyfloat('age',1.1)  # 给浮点型的数据增加数值

# 18 decr(self, name, amount=1)
# conn.decr('age')   # 减一

# 19 append(key, value)
# conn.append('name','ooo')   # 字符串拼接
conn.close()

2、hash 类型

hset  hget  hlen  hexists  hincrby  hscan_iter

import redis

conn = redis.Redis(decode_responses=True)
# 1 hset(name, key, value)
# conn.hset('userinfo','name','lqz')
# conn.hset('userinfo','age','19')

# 2 hmset(name, mapping)  弃用了,统一用hset
# conn.hmset('userinfo2',{'name':'pyy',"age":33})
# conn.hset('userinfo3',mapping={'name':'xxx',"age":33})


# 3 hget(name,key)
# print(conn.hget('userinfo','name'))
# 4 hmget(name, keys, *args)
# print(conn.hmget('userinfo',['name','age']))
# print(conn.hmget('userinfo','name','age'))


# 5 hgetall(name)  # 慎用---》userinfo 对应的value值非常多,一次性拿出来,很耗时
# print(conn.hgetall('userinfo'))

# 6 hlen(name)
# print(conn.hlen('userinfo'))

# 7 hkeys(name)
# print(conn.hkeys('userinfo'))

# 8 hvals(name)    # 获取所有的值
# print(conn.hvals('userinfo'))

# 9 hexists(name, key)
# print(conn.hexists('userinfo','hobby'))


# 10 hdel(name,*keys)
# conn.hdel('userinfo','name','age')

# 11 hincrby(name, key, amount=1)
# conn.hincrby('userinfo2','age')

# 12 hincrbyfloat(name, key, amount=1.0)


# 13 hscan(name, cursor=0, match=None, count=None)  # 不单独用
## 造数据
# for i in range(1000):
#     conn.hset('hash2','egg_%s'%i,'鸡蛋%s号'%i)

# count 数字是大致的 大小,如果拿了10 ,可能是9 可能是11
# res=conn.hscan('hash2',cursor=0,count=10)   # 无序,所以不是从egg_0开始的
# print(len(res[1]))


# 14 hscan_iter(name, match=None, count=None)  # 替代hgetall,一次性全取出值,如果占内存很大,会有风险 , 使用hscan_iter 分批获取值,内存占用很小
for item in conn.hscan_iter('hash2',count=10):
    print(item)

# 分批获取数据

conn.close()

补充:

hash 类型,就是咱们python中的字典类型, 数据结构:数据的组织形式 底层存储 数组---》根据key值使用hash函数得到结构,存到数组中
字典的key值必须可hash
字典的key值必须是不可变数据类型
hash 类型无序,跟放的先后顺序无关的
python 的字典是 有序的 字典+列表

3、列表类型 

lpush  rpush  llen  lrange  lpop

import redis

conn = redis.Redis(decode_responses=True)

# 1 lpush(name, values)
# conn.lpush('girls','刘亦菲','迪丽热巴')
# conn.lpush('girls','小红')

# 2 rpush(name, values) 表示从右向左操作
# conn.rpush('girls', '小绿')


# 3 lpushx(name, value)  #  只有key存在,才能追加
# conn.lpushx('girls','小紫')
conn.lpushx('girls1', '小紫')

# 4 rpushx(name, value) 表示从右向左操作


# 5 llen(name)
# print(conn.llen('girls'))

# 6 linsert(name, where, refvalue, value))
# conn.linsert('girls', where='before', refvalue='刘亦菲', value='新刘亦菲')
# conn.linsert('girls', where='after', refvalue='刘亦菲', value='老刘亦菲')


# 7 r.lset(name, index, value)
# conn.lset('girls',0,'oooo')  # 按索引修改某个位置值

# 8 r.lrem(name, value, num)
# conn.lrem('girls',1,'刘亦菲')   # 从左侧删一个
# conn.lrem('girls',-1,'刘亦菲')   # 从右侧删一个
# conn.lrem('girls',0,'刘亦菲')   # 全删除


# 9 lpop(name)
# print(conn.lpop('girls'))  # 左侧弹出一个
# print(conn.rpop('girls')) # 右侧弹出
# 10 rpop(name) 表示从右向左操作


# 11 lindex(name, index)
# print(conn.lindex('girls',0))

# 12 lrange(name, start, end)
# print(conn.lrange('girls',1,10000)) # 前闭后闭

# 一次性把列表中数据都取出来
# print(conn.lrange('girls', 0, -1))   # 可以用-1
# print(conn.lrange('girls', 0, conn.llen('girls')))   # 可以用-1


# 13 ltrim(name, start, end)
# conn.ltrim('girls',2,4)

# 14 rpoplpush(src, dst)
# conn.rpoplpush('girls','girls')


# 15 blpop(keys, timeout)  # block:阻塞   实现分布式的系统     消息队列
res=conn.blpop('girls',timeout=5)
print(res)

# 16 r.brpop(keys, timeout),从右向左获取数据
# 17 brpoplpush(src, dst, timeout=0)


conn.close()

# utf-8 编码的 bytes格式
# b=b'\xe8\xbf\xaa\xe4\xb8\xbd\xe7\x83\xad\xe5\xb7\xb4'
# print(b.decode('utf-8'))
#
# for i in b:
#     print(bin(i))

  

 

标签:name,girls,redis,基础,value,print,conn
From: https://www.cnblogs.com/dgp-zjz/p/17769995.html

相关文章

  • 十天学完基础数据结构-第四天(链表(Linked List))
    链表的基本概念链表是一种线性数据结构,与数组不同,链表的元素(节点)之间通过指针相互连接。链表有以下基本概念:节点:链表中的每个数据项称为节点,每个节点包含数据和一个指向下一个节点的指针。头节点:链表的第一个节点称为头节点,它通常用来表示整个链表的起始位置。尾节点:链表的最后一个......
  • redis介绍和安装、redis普通连接和连接池、redis字符串类型、redis hash类型、redis列
    redis介绍和安装#1redis什么-数据库就是个存数据的地方:只是不同数据库数据组织,存放形式不一样-mysql关系型数据库(oracle,sqlserver,postgrasql)-非关系型数据(nosql):redis,mongodb,clickhouse,infludb,elasticsearch,hadoop。。。-没有sql:没有sql语句......
  • redis模块
    一、首先了解下redis的基本使用命令:Redis支持5种数据类型:string、hash、list、set、sortedsert(有序集合):1、string是redis最基本的类型,一个key对应一个value。string类型是二进制安全的,也就说它可以包含任何数据,如图片、序列化的对象等。基本操作命令:127.0.0.1:6379>setname......
  • Lab2:数据组织基础方法及创新应用(创新)
    1.数组指针定义int(*)[]数组指向二维int数组定义int指针指向二维数组的第一个元素指针的写法较多,从我个人的尝试中选择几种写法分析。代码1:#include<bits/stdc++.h>usingnamespacestd;int*p[12];//数组的每一个元素都是指针inta[12][12];voidinit(){ for......
  • DataWhale DAY2 基础语法1
    DataWhaleDAY2基础语法1今天主要是一点入门语法,import什么的,所以重点不放在上面。语法部分专门开一章:https://www.cnblogs.com/hewo/p/17635277.html关于浮点数精度问题,倒是有点意思。以前学c++的时候,尤其是计算几何的时候,经常设一个极小常量来比较,现在明白本质上是进......
  • java基础,java基本数据类型、引用数据类型
    java数据类型基本数据类型:1,整型:byte(1字节),short(2字节),int(4字节),long(8字节)2,浮点型:float(单精度4字节),double(双精度8字节)3,字符型:char(2字节)4,布尔型:boolean(true/false)引用数据类型:1,类class引用例如Object:Object是一个很重要的类,Object是类层次结构的根类,每个类都使用Object作为......
  • 请在课上练习的基础上,实现输出加减法混合的运算题目列表。请提交代码及运行效果截图。
    importjava.util.Random;publicclassMathOperationGenerator{  publicstaticvoidmain(String[]args){    intnumberOfQuestions=10;//指定生成题目的数量    generateMathQuestions(numberOfQuestions);  }  publicstaticvoidgenerateMat......
  • Linux基础——tmpfs挂载到root目录
    1、(卸载/tmp目录前,请备份/tmp目录下重要数据)查看/tmp目录的挂载情况df-h 卸载/tmp目录umount-lf/tmp 2、关闭tmp挂载及tmpfiles相关服务关闭自动挂载/tmp目录服务systemctldisabletmp.mountsystemctlstatustmp.mount 标记masktmp目录服务,禁止对服务操......
  • 实验一 类与对象_基础编程1
    task1.cpp1#include<iostream>2#include<string>3#include<vector>4#include<array>56template<typenameT>7voidoutput1(constT&obj){8for(autoi:obj)9std::cout<<i<<","......
  • day05-java基础1
    Java介绍#java:做反编译,发现好多java代码看不太懂,有些加密算法,也不太好破---》接下来的时候,要学习java开发 -找到加密算法---》chatgpt,让它给你写---》转成python---》自己手动调#java编译型语言 -javase:java基础---》python中变量定义,函数,面向对象,文件处理,并发,网络编程......