您身边的网站建设专家
成功案例

【建站服务】九江企业网站设计 - 九江高端网站定制 - 九江品牌网站搭建 - 上往建站-域名申请

日期: 2022-09-21 04:12:32 浏览数:4


上往建站提供服务器空间服务商百度快照排名网站托管百度推广运营,致力于设计外包服务与源代码定制开发360推广搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。



九江企业网站设计 - 九江高端网站定制 - 九江品牌网站搭建 - 上往建站

网站建设.png

sts(name, key)

检查 name 对应的 hash 是否存在当前传入的 key

实例

print(r.hexists("hash1", "k4"))  # False 不存在
print(r.hexists("hash1", "k1"))  # True 存在

8、删除键值对

hdel(name,*keys)

将name对应的hash中指定key的键值对删除

实例

print(r.hgetall("hash1"))
r.hset("hash1", "k2", "v222")   # 修改已有的key k2
r.hset("hash1", "k11", "v1")   # 新增键值对 k11
r.hdel("hash1", "k1")    # 删除一个键值对
print(r.hgetall("hash1"))

9、自增自减整数(将key对应的value--整数 自增1或者2,或者别的整数 负数就是自减)

hincrby(name, key, amount=1)

自增name对应的hash中的指定key的值,不存在则创建key=amount

参数:

实例

r.hset("hash1", "k3", 123)
r.hincrby("hash1", "k3", amount=-1)
print(r.hgetall("hash1"))
r.hincrby("hash1", "k4", amount=1)  # 不存在的话,value默认就是1
print(r.hgetall("hash1"))

10、自增自减浮点数(将key对应的value--浮点数 自增1.0或者2.0,或者别的浮点数 负数就是自减)

hincrbyfloat(name, key, amount=1.0)

自增name对应的hash中的指定key的值,不存在则创建key=amount

参数:

自增 name 对应的 hash 中的指定 key 的值


Python redis 使用介绍

分类 编程技术

本章节我们将为大家介绍 Python 如何操作 redis,redis 是一个 Key-Value 数据库,Value 支持 string(字符串),list(列表),set(集合),zset(有序集合),hash(哈希类型)等类型。


关于 redis 的更多内容可以参考我们的 redis 教程,注意在学习本章节之前你要确保你的 redis 服务已经安装。


redis 启动界面如下:


启动 redis

$ ./redis-server

75858:C 25 Oct 11:43:34.329 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf

75858:M 25 Oct 11:43:34.331 * Increased maximum number of open files to 10032 (it was originally set to 256).

                _._                                                  

           _.-``__ ''-._                                            

      _.-``    `.  `_.  ''-._           Redis 3.0.3 (255fcb1a/0) 64 bit

  .-`` .-```.  ```/    _.,_ ''-._                                  

 (    '      ,       .-`  | `,    )     Running in standalone mode

 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379

 |    `-._   `._    /     _.-'    |     PID: 75858

  `-._    `-._  `-./  _.-'    _.-'                                  

 |`-._`-._    `-.__.-'    _.-'_.-'|                                  

 |    `-._`-._        _.-'_.-'    |           http://redis.io        

  `-._    `-._`-.__.-'_.-'    _.-'                                  

 |`-._`-._    `-.__.-'    _.-'_.-'|                                  

 |    `-._`-._        _.-'_.-'    |                                  

  `-._    `-._`-.__.-'_.-'    _.-'                                  

      `-._    `-.__.-'    _.-'                                      

          `-._        _.-'                                          

              `-.__.-'                                              


75858:M 25 Oct 11:43:34.337 # Server started, Redis version 3.0.3

75858:M 25 Oct 11:43:34.339 * DB loaded from disk: 0.002 seconds

75858:M 25 Oct 11:43:34.339 * The server is now ready to accept connections on port 6379

可以看到默认端口号为 6379。


安装 redis 模块

Python 要使用 redis,需要先安装 redis 模块:


sudo pip3 install redis

sudo easy_install redis

sudo python setup.py install

源码地址:https://github.com/WoLpH/redis-py


测试是否安装成功:


>>> import redis

>>> r = redis.StrictRedis(host='localhost', port=6379, db=0)

>>> r.set('foo', 'bar')

True

>>> r.get('foo')

'bar'

redis 提供两个类 Redis 和 StrictRedis, StrictRedis 用于实现大部分官方的命令,Redis 是 StrictRedis 的子类,用于向后兼用旧版本。


redis 取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串。


实例

import redis   # 导入redis 模块


r = redis.Redis(host='localhost', port=6379, decode_responses=True)  

r.set('name', 'runoob')  # 设置 name 对应的值

print(r['name'])

print(r.get('name'))  # 取出键 name 对应的值

print(type(r.get('name')))  # 查看类型

输出结果为:


runoob

runoob

<class 'str'>

连接池

redis-py 使用 connection pool 来管理对一个 redis server 的所有连接,避免每次建立、释放连接的开销。


默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数 Redis,这样就可以实现多个 Redis 实例共享一个连接池。


实例

import redis    # 导入redis 模块


pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)

r = redis.Redis(host='localhost', port=6379, decode_responses=True)  

r.set('name', 'runoob')  # 设置 name 对应的值

print(r.get('name'))  # 取出键 name 对应的值

redis 基本命令 String

set(name, value, ex=None, px=None, nx=False, xx=False)


在 Redis 中设置值,默认,不存在则创建,存在则修改。


参数:


ex - 过期时间(秒)

px - 过期时间(毫秒)

nx - 如果设置为True,则只有name不存在时,当前set操作才执行

xx - 如果设置为True,则只有name存在时,当前set操作才执行

1.ex - 过期时间(秒) 这里过期时间是3秒,3秒后p,键food的值就变成None


实例

import redis


pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)

r = redis.Redis(connection_pool=pool)

r.set('food', 'mutton', ex=3)    # key是"food" value是"mutton" 将键值对存入redis缓存

print(r.get('food'))  # mutton 取出键food对应的值

2.px - 过期时间(豪秒) 这里过期时间是3豪秒,3毫秒后,键foo的值就变成None


实例

import redis


pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)

r = redis.Redis(connection_pool=pool)

r.set('food', 'beef', px=3)

print(r.get('food'))

3.nx - 如果设置为True,则只有name不存在时,当前set操作才执行 (新建)


实例

import redis


pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)

r = redis.Redis(connection_pool=pool)

print(r.set('fruit', 'watermelon', nx=True))    # True--不存在

# 如果键fruit不存在,那么输出是True;如果键fruit已经存在,输出是None

4.xx - 如果设置为True,则只有name存在时,当前set操作才执行 (修改)


实例

print((r.set('fruit', 'watermelon', xx=True)))   # True--已经存在

# 如果键fruit已经存在,那么输出是True;如果键fruit不存在,输出是None

5.setnx(name, value)


设置值,只有name不存在时,执行设置操作(添加)


print(r.setnx('fruit1', 'banana'))  # fruit1不存在,输出为True

6.setex(name, time, value)


设置值


参数:


time - 过期时间(数字秒 或 timedelta对象)


实例

import redis

import time


pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)

r = redis.Redis(connection_pool=pool)

r.setex("fruit2", 5, "orange")

time.sleep(5)

print(r.get('fruit2'))  # 5秒后,取值就从orange变成None

7.psetex(name, time_ms, value)


设置值


参数:


time_ms - 过期时间(数字毫秒 或 timedelta对象)


实例

r.psetex("fruit3", 5000, "apple")

time.sleep(5)

print(r.get('fruit3'))  # 5000毫秒后,取值就从apple变成None

8.mset(*args, **kwargs)


批量设置值


如:


实例

r.mget({'k1': 'v1', 'k2': 'v2'})

r.mset(k1="v1", k2="v2") # 这里k1 和k2 不能带引号,一次设置多个键值对

print(r.mget("k1", "k2"))   # 一次取出多个键对应的值

print(r.mget("k1"))

9.mget(keys, *args)


批量获取


如:


实例

print(r.mget('k1', 'k2'))

print(r.mget(['k1', 'k2']))

print(r.mget("fruit", "fruit1", "fruit2", "k1", "k2"))  # 将目前redis缓存中的键对应的值批量取出来

10.getset(name, value)


设置新值并获取原来的值


print(r.getset("food", "barbecue"))  # 设置的新值是barbecue 设置前的值是beef

11.getrange(key, start, end)


获取子序列(根据字节获取,非字符)


参数:


name - Redis 的 name

start - 起始位置(字节)

end - 结束位置(字节)

如: "君惜大大" ,0-3表示 "君"


实例

r.set("cn_name", "君惜大大") # 汉字

print(r.getrange("cn_name", 0, 2))   # 取索引号是0-2 前3位的字节 君 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)

print(r.getrange("cn_name", 0, -1))  # 取所有的字节 君惜大大 切片操作

r.set("en_name","junxi") # 字母

print(r.getrange("en_name", 0, 2))  # 取索引号是0-2 前3位的字节 jun 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)

print(r.getrange("en_name", 0, -1)) # 取所有的字节 junxi 切片操作

12.setrange(name, offset, value)


修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)


参数:


offset - 字符串的索引,字节(一个汉字三个字节)

value - 要设置的值

实例

r.setrange("en_name", 1, "ccc")

print(r.get("en_name"))    # jccci 原始值是junxi 从索引号是1开始替换成ccc 变成 jccci

13.setbit(name, offset, value)


对 name 对应值的二进制表示的位进行操作


参数:


name - redis的name

offset - 位的索引(将值变换成二进制后再进行索引)

value - 值只能是 1 或 0

注:如果在Redis中有一个对应: n1 = "foo",


那么字符串foo的二进制表示为:01100110 01101111 01101111


所以,如果执行 setbit('n1', 7, 1),则就会将第7位设置为1,


那么最终二进制则变成 01100111 01101111 01101111,即:"goo"


扩展,转换二进制表示:


实例

source = "陈思维"

source = "foo"

for i in source:

num = ord(i)

print bin(num).replace('b','')

特别的,如果source是汉字 "陈思维"怎么办?


答:对于utf-8,每一个汉字占 3 个字节,那么 "陈思维" 则有 9个字节 对于汉字,for循环时候会按照 字节 迭代,那么在迭代时,将每一个字节转换 十进制数,然后再将十进制数转换成二进制 11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000


14.getbit(name, offset)


获取name对应的值的二进制表示中的某位的值 (0或1)


print(r.getbit("foo1", 0)) # 0 foo1 对应的二进制 4个字节 32位 第0位是0还是1

15.bitcount(key, start=None, end=None)


获取name对应的值的二进制表示中 1 的个数


参数:


key - Redis的name

start - 字节起始位置

end - 字节结束位置

实例

print(r.get("foo"))  # goo1 01100111

print(r.bitcount("foo",0,1))  # 11 表示前2个字节中,1出现的个数

16.bitop(operation, dest, *keys)


获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值


参数:


operation - AND(并) 、 OR(或) 、 NOT(非) 、 XOR(异或)

dest - 新的Redis的name

*keys - 要查找的Redis的name

如:


bitop("AND", 'new_name', 'n1', 'n2', 'n3')

获取Redis中n1,n2,n3对应的值,然后讲所有的值做位运算(求并集),然后将结果保存 new_name 对应的值中


实例

r.set("foo","1")  # 0110001

r.set("foo1","2")  # 0110010

print(r.mget("foo","foo1"))  # ['goo1', 'baaanew']

print(r.bitop("AND","new","foo","foo1"))  # "new" 0 0110000

print(r.mget("foo","foo1","new"))


source = "12"

for i in source:

num = ord(i)

print(num)  # 打印每个字母字符或者汉字字符对应的ascii码值 f-102-0b100111-01100111

print(bin(num))  # 打印每个10进制ascii码值转换成二进制的值 0b1100110(0b表示二进制)

print bin(num).replace('b','')  # 将二进制0b1100110替换成01100110

17.strlen(name)


返回name对应值的字节长度(一个汉字3个字节)


print(r.strlen("foo"))  # 4 'goo1'的长度是4

18.incr(self, name, amount=1)


自增 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自增。


参数:


name - Redis的name

amount - 自增数(必须是整数)

注:同 incrby


实例

r.set("foo", 123)

print(r.mget("foo", "foo1", "foo2", "k1", "k2"))

r.incr("foo", amount=1)

print(r.mget("foo", "foo1", "foo2", "k1", "k2"))

应用场景 – 页面点击数

假定我们对一系列页面需要记录点击次数。例如论坛的每个帖子都要记录点击次数,而点击次数比回帖的次数的多得多。如果使用关系数据库来存储点击,可能存在大量的行级锁争用。所以,点击数的增加使用redis的INCR命令最好不过了。


当redis服务器启动时,可以从关系数据库读入点击数的初始值(12306这个页面被访问了34634次)


r.set("visit:12306:totals", 34634)

print(r.get("visit:12306:totals"))

每当有一个页面点击,则使用INCR增加点击数即可。


r.incr("visit:12306:totals")

r.incr("visit:12306:totals")

页面载入的时候则可直接获取这个值


print(r.get("visit:12306:totals"))

19.incrbyfloat(self, name, amount=1.0)


自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。


参数:


name - Redis的name

amount - 自增数(浮点型)

实例

r.set("foo1", "123.0")

r.set("foo2", "221.0")

print(r.mget("foo1", "foo2"))

r.incrbyfloat("foo1", amount=2.0)

r.incrbyfloat("foo2", amount=3.0)

print(r.mget("foo1", "foo2"))

20.decr(self, name, amount=1)


自减 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自减。


参数:


name - Redis的name

amount - 自减数(整数)

实例

r.decr("foo4", amount=3) # 递减3

r.decr("foo1", amount=1) # 递减1

print(r.mget("foo1", "foo4"))

21.append(key, value)


在redis name对应的值后面追加内容


参数:


key - redis的name

value - 要追加的字符串

实例

r.append("name", "haha")    # 在name对应的值junxi后面追加字符串haha

print(r.mget("name"))

redis 基本命令 hash

1、单个增加--修改(单个取出)--没有就新增,有的话就修改

hset(name, key, value)

name对应的hash中设置一个键值对(不存在,则创建;否则,修改)


参数:


name - redis的name

key - name对应的hash中的key

value - name对应的hash中的value

注:hsetnx(name, key, value) 当name对应的hash中不存在当前key时则创建(相当于添加)


实例

import redis

import time


pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)

r = redis.Redis(connection_pool=pool)


r.hset("hash1", "k1", "v1")

r.hset("hash1", "k2", "v2")

print(r.hkeys("hash1")) # 取hash中所有的key

print(r.hget("hash1", "k1"))    # 单个取hash的key对应的值

print(r.hmget("hash1", "k1", "k2")) # 多个取hash的key对应的值

r.hsetnx("hash1", "k2", "v3") # 只能新建

print(r.hget("hash1", "k2"))

2、批量增加(取出)

hmset(name, mapping)

在name对应的hash中批量设置键值对


参数:


name - redis的name

mapping - 字典,如:{'k1':'v1', 'k2': 'v2'}

如:


实例

r.hmset("hash2", {"k2": "v2", "k3": "v3"})

hget(name,key)

在name对应的hash中获取根据key获取value


hmget(name, keys, *args)

在name对应的hash中获取多个key的值


参数:


name - reids对应的name

keys - 要获取key集合,如:['k1', 'k2', 'k3']

*args - 要获取的key,如:k1,k2,k3

如:


实例

print(r.hget("hash2", "k2"))  # 单个取出"hash2"的key-k2对应的value

print(r.hmget("hash2", "k2", "k3"))  # 批量取出"hash2"的key-k2 k3对应的value --方式1

print(r.hmget("hash2", ["k2", "k3"]))  # 批量取出"hash2"的key-k2 k3对应的value --方式2

3、取出所有的键值对

hgetall(name)

获取name对应hash的所有键值


print(r.hgetall("hash1"))

4、得到所有键值对的格式 hash长度

hlen(name)

获取name对应的hash中键值对的个数


print(r.hlen("hash1"))

5、得到所有的keys(类似字典的取所有keys)

hkeys(name)

获取name对应的hash中所有的key的值


print(r.hkeys("hash1"))

6、得到所有的value(类似字典的取所有value)

hvals(name)

获取name对应的hash中所有的value的值


print(r.hvals("hash1"))

7、判断成员是否存在(类似字典的in)

hexists(name, key)

检查 name 对应的 hash 是否存在当前传入的 key


实例

print(r.hexists("hash1", "k4"))  # False 不存在

print(r.hexists("hash1", "k1"))  # True 存在

8、删除键值对

hdel(name,*keys)

将name对应的hash中指定key的键值对删除


实例

print(r.hgetall("hash1"))

r.hset("hash1", "k2", "v222")   # 修改已有的key k2

r.hset("hash1", "k11", "v1")   # 新增键值对 k11

r.hdel("hash1", "k1")    # 删除一个键值对

print(r.hgetall("hash1"))

9、自增自减整数(将key对应的value--整数 自增1或者2,或者别的整数 负数就是自减)

hincrby(name, key, amount=1)

自增name对应的hash中的指定key的值,不存在则创建key=amount


参数:


name - redis中的name

key - hash对应的key

amount - 自增数(整数)

实例

r.hset("hash1", "k3", 123)

r.hincrby("hash1", "k3", amount=-1)

print(r.hgetall("hash1"))

r.hincrby("hash1", "k4", amount=1)  # 不存在的话,value默认就是1

print(r.hgetall("hash1"))

10、自增自减浮点数(将key对应的value--浮点数 自增1.0或者2.0,或者别的浮点数 负数就是自减)

hincrbyfloat(name, key, amount=1.0)

自增na




九江企业网站设计 - 九江高端网站定制 - 九江品牌网站搭建 - 上往建站



上往建站提供搭建网站域名注册官网备案服务网店详情页设计企业网店专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管网页美工排版,致力于域名申请竞价托管软文推广全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机网站推广百度竞价托管网站建设上网建站推广服务网络公司有哪些等业务,专业团队服务,效果好。

服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)


全国咨询热线:400-111-6878

地址:全国各地都有驻点商务

Copyright © 2021 通陆科技

网站建设上往建站