luffy-09/redis

这里写目录标题

  • 一.昨日回顾
  • 二.今日内容
    • 1.redis介绍
    • 2.redis的Windows安装和配置
    • 3.普通链接和连接池
      • 3.1代码
      • 3.2redis_pool.py
    • 4.redis之string操作
    • 5.redis之hash操作

一.昨日回顾

1 腾讯短信平台封装,配置信息不要写死,放到配置文件中,设置成常量
2 发送短信验证码的接口
	-get
	-如何防止被盗用:1 频率限制,ip限制 2 集成第三方认证
	-验证码保存到缓存中(原来session中)
3 验证码登录接口
	-post--->手机号和验证码--->验证码合法,手机号是注册用户--->签发token
4 验证码+手机号+密码注册
	-post--->注册用户,用户名设置成了手机号
5 注册功能前后端打通

二.今日内容

1.redis介绍

0 cs架构,key-value存储(没有表,各种关系)
1 redis--->是存储数据的软件,跟语言无关,纯内存数据库(所有数据都放在内存中)
2 速度非常快,支持的数据类型多样(5大数据类型:字符串,列表,字典,集合,有序集合)
3 Memcached和redis比较
	-redis是单线程,单进程,数据类型丰富(只针对于redis6.0以下)
	-memcache多线程多进程,数据类型单一
3.1 redis为什么单线程,单进程速度这么快?
	-10w,生产环境单机6w左右
	-1 纯内存数据库
	-2 io多路复用,epoll模型(Linux上支持),Windows上支持select
	-3 单线程单进程,避免了线程间切换
4 redis:开源软件,c语言写的,早期版本2w3千行,对Windows不支持 
	6.0.6
	-在不同平台编译--->可执行文件--->执行
	-Windows官方:又有大神把源码,在Windows上编译-->可以运行在Windows上(3.x)

2.redis的Windows安装和配置

1 https://github.com/microsoftarchive/redis/releases
    Redis-x64-3.2.100.msi:一路下一步,安装完成
2 6379:端口号
3 自动创建服务,服务运行
	本质是一条命令:redis-server redis.Windows-service.conf
	redis-server 配置文件
4 手动启动redis的服务端
	redis-server:服务端   
    	redis-server:就启动了,但是使用的是默认配置
        redis-server 配置文件:以该配置文件启动
    redis-cli:客户端
    	redis-cli:默认连接到本地的6379端口
        redis-cli -h 127.0.0.1 -p 6379
    图形化客户端:
    	redis-desktop-manager:图形化客户端(收费)

3.普通链接和连接池

1 使用python连接redis
2 pip3 install redis
3 使用python代码连接redis服务端,python代码就是客户端,跟使用图形化界面是一样的
	GUI---》可以开发出图形化界面的redis客户端

3.1代码

# 1 普通连接
# from redis import Redis
# # 拿到一个redis连接
# # conn=Redis()
# conn=Redis(host='127.0.0.1', port=6379)
#
# # 使用连接操作
# conn.set('age','18')
# conn.close()



# 2 连接池
# import redis
# # 创建出一个连接池
# pool = redis.ConnectionPool(host='127.0.0.1', port=6379,max_connections=100)
# # 从连接池中拿一个连接
# conn = redis.Redis(connection_pool=pool)
# conn.set('foo', 'Bar')
#
# conn.close()


# 实际应用
import redis
from redis_pool import POOL  # Pool是单例,
conn=redis.Redis(connection_pool=POOL)
conn.set('age',18)
conn.close()

3.2redis_pool.py

import redis
POOL=redis.ConnectionPool(host='127.0.0.1', port=6379,max_connections=100)

4.redis之string操作




# 字符串,列表,字典

import redis
conn=redis.Redis()
###  1 set 的使用
# name:key值
# value:value值
# ex:过期时间,按秒记
# px:过期时间(毫秒)
# nx:如果设置为True,则只有name不存在时,当前set操作才执行,值存在,就修改不了,执行没效果
# xx:如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值
# conn.set('name','egon')
# conn.set('name','lqz',nx=True)
# conn.set('name','lqz',xx=True)
# conn.set('age','18',xx=True)


## 2 get
# res=conn.get('name')
# print(res)  # 返回的数据是byte格式


##3 setnx(name, value)
# 设置值,只有name不存在时,执行设置操作(添加),如果存在,不会修改
# conn.setnx('name','egon')

##4 setex(name, time,value, )
# conn.setex('name',3,'egon')


## 5 mset

# conn.mset({'name':'lqz','age':19,'sex':'男'})
## 6 mget

# res=conn.mget('name','age')
# res=conn.mget(['name','age'])
# print(res)


## 7 getset(name, value)
# 一次网络io,完成了取值和设置
# res=conn.getset('name','egon')
# print(res)

## 8 getrange(key, start, end)

# 前闭后闭区间
# res=conn.getrange('name',0,4)
# 最终效果跟上面一样
# res=conn.get('name').decode('utf-8')
# print(res[0:5])
# print(res)


# setrange(name, offset, value)
# conn.setrange('name',0,'tt')
# conn.setrange('name',5,'tt')
# conn.setrange('name',7,'ttttttttttttttttttttttttt')


# setbit(name, offset, value)
# conn.set('n1','foo')
#那么字符串foo的二进制表示为:01100110 01101111 01101111
# conn.setbit('n1',7,1)
# #那么字符串foo的二进制表示为:01100111 01101111 01101111
# res=conn.get('n1')

# getbit(name, offset)
# 获取bit位的第几个位置,看是1还是0
# res=conn.getbit('n1',7)
# print(res)


# bitcount(key, start=None, end=None)
# end:指的是bytes,前闭后闭区间
# res=conn.bitcount('n1',0,1)
# print(res)



### incr 重点
# 每次自增1
# 统计网页访问量,文章阅读量,粉丝数量,计数相关(不会存在并发安全的问题)
# conn.incr('age',-2)
# res=conn.get('age')

# conn.decr('age')
# res=conn.get('age')
# print(res)


# append
# conn.append('name','lqz')
#
# res=conn.get('name')
# print(res)
#
# conn.close()


## 总结
# set:超时时间,nx,xx
# get
# mset
# mget
# incr
# decr
# getrange
# setrange
# append


5.redis之hash操作

字典(字典,在内存中如何存储的),hash类型

import redis
conn=redis.Redis()

# hset
# conn.hset('userinfo','name','lqz')
# conn.hset('userinfo','age','18')
# conn.hset('userinfo','sex','男')

# hmset
# conn.hmset('userinfo_2',{'name':'egon','age':18,'sex':'男'})

#hget
# res=conn.hget('userinfo','name')

# hmget
# res=conn.hmget('userinfo','age','name')
# res=conn.hmget('userinfo',['age','name'])

# hgetall
# res=conn.hgetall('userinfo')


# hlen(name)
# res=conn.hlen('userinfo')

# hkeys(name)
# res=conn.hkeys('userinfo')
# hvals(name)
# res=conn.hvals('userinfo')


# hexists(name, key)
# res=conn.hexists('userinfo','hobby')
# res=conn.hexists('userinfo','name')

#hdel
# res=conn.hdel('userinfo','name','age')

#hincrby
# res=conn.hset('userinfo','age',19)
# conn.hincrby('userinfo','age')
# res=conn.hget('userinfo','age')


# hscan

# for i in range(1000):
#     conn.hset('test','test_'+str(i),str(i))

# 不建议使用
# res=conn.hgetall('test')

# 不怎么用

# name,redis的name
# cursor,游标(基于游标分批取获取数据)
# match,匹配指定key,默认None 表示所有的key
# count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数


res=conn.hscan('test',cursor=478,count=500)
print(res)
# print(len(res[1]))

# hscan_iter

# res=conn.hscan_iter('test',count=10)



# 以后要使用hgetall的时候,要使用如下方式
for item in conn.hscan_iter('test',count=10):
    print(item)


# print(res)


conn.close()



## 总结
'''
hset
hget
hmset
hmget
hincrby
hdel
hexists

hscan_iter/hgetall 区分

'''

参考博客:(更加详细)

你可能感兴趣的:(start,all,over,again)