Redis 优点
是单线程的,读写速度非常快,效率很高,每秒可以执行大约110000设置操作,81000个/每秒的读取操作。
支持丰富的数据类型 : Redis支持最大多数开发人员已经知道如列表,集合,可排序集合,哈希等数据类型。
操作都是原子的 : 所有 Redis 的操作都是原子,从而确保当两个客户同时访问 Redis 服务器得到的是更新后的值(最新值)。
MultiUtility工具:Redis是一个多功能实用工具,可以在很多如:缓存,消息传递队列中使用(Redis原生支持发布/订阅),在应用程序中,如:Web应用程序会话,网站页面点击数等任何短暂的数据;
Redis 需要安装。
PYTHON链接方式
一种
import
redis
r
=
redis.Redis(host
=
'localhost'
, port
=
6379
)
r.
set
(
'foo'
,
'Bar'
)
print
r.get(
'foo'
)
import
redis
pool
=
redis.ConnectionPool(host
=
"localhost"
,port
=
6379
)
r
=
redis.Redis(connection_pool
=
pool)
r.
set
(
'foo'
,
'bar'
)
print
(r.get(
'foo'
))
#打印出来的是bytes类型,因为在python3中,通过socket的都是bytes类型
python 操作
1,set(name, value, ex=None, px=None, nx=False, xx=False)
Redis中设置值,默认,不存在则创建,存在则修改
参数:
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为
True
,则只有name不存在时,当前
set
操作才执行
xx,如果设置为
True
,则只有name存在时,当前
set
操作才执行
2,setnx(name, value)
设置值,只有name不存在时,执行设置操作(添加),相当于
set
name *** nx
3,setex(name, value, time) (秒)
设置值
# 参数:
# time,过期时间(数字秒 或 timedelta对象)
#相当于 set name **** ex 2
4,psetex(name, time_ms, value)(毫秒)
设置值
# 参数:
# time_ms,过期时间(数字毫秒 或 timedelta对象)
#相当于 set name *** px 2
批量设置值
如:
mset(k1
=
'v1'
, k2
=
'v2'
)
或
mget({
'k1'
:
'v1'
,
'k2'
:
'v2'
})
按顺序 排列前面键后面值,同过键去值。
6、get(name)
获取值。
7,mget(keys, *args)
批量获取
如:
mget(
'*****'
,
'****'
)
或
r.mget([
'****'
,
'****'
])
8,getset(name, value)
设置新值并获取原来的值 修改后可以获取原来的值,可以保存下来。
9、getrange(key, start, end)
# 获取子序列(根据字节获取,非字符) (相当于把字符串切片,用下标取值)
# 参数:
# name,Redis 的 name
# start,起始位置(字节)
# end,结束位置(字节)
# 如: "张耀庆" ,0-3表示 "张"
127.0
.
0.1
:
6379
[
1
]>
set
name zhang
OK
127.0
.
0.1
:
6379
[
1
]> getrange name
0
1
#获取0到1的字符串,这边相当于切片,但是是顾头又顾尾
"zh"
10、setrange(name, offset, value)
修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
# 参数:
# offset,字符串的索引,字节(一个汉字三个字节)
# value,要设置的值
127.0
.
0.1
:
6379
[
1
]> get name
"zhang"
127.0
.
0.1
:
6379
[
1
]> setrange name
3
m
#把字符串中的第3个字符替换成m
(integer)
10
127.0
.
0.1
:
6379
[
1
]> get name
"zhamg"
11、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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
第一个字 第二个 第三个
*用途举例,用最省空间的方式,存储在线用户数及分别是哪些用户在线
12、getbit(name, offset)
# 获取name对应的值的二进制表示中的某位的值 (0或1)
13、bitcount(key, start=None, end=None)
# 获取name对应的值的二进制表示中 1 的个数
# 参数:
# key,Redis的name
# start,位起始位置
# end,位结束位置
14、strlen(name)
# 返回name对应值的字节长度(一个汉字3个字节)
15、incr(self, name, amount=1)
# 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
# 参数:
# name,Redis的name
# amount,自增数(必须是整数)
# 注:同incrby
*用途举例,这个一般用于计算用户的登录的总量的。
16、incrbyfloat(self, name, amount=1.0)
# 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
# 参数:
# name,Redis的name
# amount,自增数(浮点型)
17、decr(self, name, amount=1)
自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。
# 参数:
# name,Redis的name
# amount,自减数(整数)
*用途举例,用于如果用户账户失效,则减去
18、append(key, value)
# 在redis name对应的值后面追加内容
# 参数:
key, redis的name
value, 要追加的字符串
19、help 变量名
#查看操作的使用方法
help set 命令
着学都是Redis的字符串用法