https://www.cnblogs.com/guotianbao/p/8683037.htmlhtml
学习资料: 电子书资源 python
联系邮箱:gmu1592618@gmail.comgit
flask微电影: movie_project github
正文shell
xshell连上服务器,依次输入如下代码:flask
1
2
3
4
|
wget http:
/
/
download.redis.io
/
releases
/
redis
-
3.0
.
6.tar
.gz
tar xzf redis
-
3.0
.
6.tar
.gz
cd redis
-
3.0
.
6
make
|
若是不巧发生如下截图中的错误:centos
说明未安装gcc,若是是centos系统,输入:yum install gcc安装gcc便可,而后再次输入make执行。缓存
输入make后,很不幸,再次发生以下截图错误:服务器
推测是由于编译库的问题。
将make改成make MALLOC=libc 再次运行!好事多磨。
终于安装成功了!
还有配置文件的修改什么的先不折腾了,此时已然能够启动Redis服务
1
2
3
4
5
6
7
8
|
src
/
redis
-
server
# 启动服务端
# 启动客户端的代码以下
src
/
redis
-
cli
redis>
set
foo bar
OK
redis> get foo
"bar"
|
看到上面的图像,说明服务端已经起来了!
可是看到不少WARNING,没错,此时你用pycharm写了链接redis服务端的代码,可是你发现服务端居然没有响应
OK,在服务端Ctrl + C ,先把服务断开
分别执行下面的语句:
1
2
3
4
|
echo
511
>
/
proc
/
sys
/
net
/
core
/
somaxconn
echo
"vm.overcommit_memory = 1"
>>
/
etc
/
sysctl.conf
sysctl vm.overcommit_memory
=
1
echo never >
/
sys
/
kernel
/
mm
/
transparent_hugepage
/
enabled
|
在/etc下的rc.local的最后添加:
1
|
echo never >
/
sys
/
kernel
/
mm
/
transparent_hugepage
/
enabled
|
最后的重点来了,折腾半天仍是服务器不鸟我,无奈之下试了试临时关闭防火墙:
1
|
service iptables stop
|
唉呀呀,终于成功了!
我在另外一台服务器用了另外一种搭建方法:传送门也成功了,可是也不要忘记要临时关掉防火墙。
1
2
3
4
5
|
import
redis
conn
=
redis.Redis(host
=
'207.148.120.229'
, port
=
6379
)
conn.
set
(
'foo'
,
'Bar'
)
print
(conn.get(
'foo'
))
a
=
input
(
'按任意键结束'
)
|
为了减小每次创建、释放链接的开销,推荐使用链接池
redis使用connection pool来管理对一个redis服务的全部链接。
多个redis实例可共享一个链接池。
1
2
3
4
5
6
7
|
import
redis
pool
=
redis.ConnectionPool(host
=
'207.148.120.229'
,port
=
6379
)
conn
=
redis.Redis(connection_pool
=
pool)
conn.
set
(
'key'
,
'Hello World'
)
print
(conn.get(
'key'
))
a
=
input
(
'按任意键结束'
)
|
redis中的String在在内存中按照一个key对应一个value来存储。以键值对的方式存储。
set(name, value, ex=None, px=None, nx=False, xx=False)
mset(*args, **kwargs) 批量设置值
get(name) 获取值
print(conn.get('k1'))
mget(keys, *args) 批量获取值
getset(name, value) 设置新值并获取原来的值
getrange(key, start, end) 获取name对应value的指定字节
setrange(name, offset, value) 从指定字节开始替换新值
strlen(name) 获取name对应的value的长度
incr(self, name, amount=1) name存在,则自增amount,不然设置name的value值为amount
decr(self, name, amount=1) 自减(整数)
append(key, value)
hset(name, key, value) 设置值
hmset(name, mapping) 批量设置值
hmget(name, keys, *args) 获取多个值
hgetall(name) 获取name对应hash的全部键值
hlen(name) 获取name对应的hash中键值对的个数
hkeys(name) 获取name对应的hash中全部的key的值
hvals(name) 获取name对应的hash中全部的value的值
hdel(name,*keys) 将name对应的hash中指定key的键值对删除
hincrby(name, key, amount=1) 自增(整数)
hincrbyfloat(name, key, amount=1.0) 自增(浮点数)
hscan(name, cursor=0, match=None, count=None) 增量式迭代获取
hscan_iter(name, match=None, count=None)
lpush(name,values)
lpushx(name,value)
llen(name) name对应的list元素的个数
linsert(name, where, refvalue, value))
r.lset(name, index, value)
r.lrem(name, value, num)
lpop(name)
lindex(name, index) 在name对应的列表中根据索引获取列表元素
lrange(name, start, end)
ltrim(name, start, end)
rpoplpush(src, dst)
blpop(keys, timeout)
# 将多个列表排列,按照从左到右去pop对应列表的元素 # 参数: # keys,redis的name的集合 # timeout,超时时间,当元素全部列表的元素获取完以后,阻塞等待列表内有数据的时间(秒), 0 表示永远阻塞 # 更多: # r.brpop(keys, timeout),从右向左获取数据
brpoplpush(src, dst, timeout=0)
自定义增量迭代
Set集合就是不容许重复的列表
sadd(name,values) name对应的集合中添加元素
scard(name) 获取name对应的集合中元素个数
sdiff(keys, *args) 在第一个name对应的集合中且不在其余name对应的集合的元素集合
sdiffstore(dest, keys, *args) 获取第一个name对应的集合中且不在其余name对应的集合,再将其新加入到dest对应的集合中
sinter(keys, *args) 获取多一个name对应集合的并集
sinterstore(dest, keys, *args) 获取多一个name对应集合的并集,再讲其加入到dest对应的集合中
sismember(name, value) 检查value是不是name对应的集合的成员
smembers(name) 获取name对应的集合的全部成员
smove(src, dst, value) 将某个成员从一个集合中移动到另一个集合
spop(name) 从集合的右侧(尾部)移除一个成员,并将其返回
srandmember(name, numbers) 从name对应的集合中随机获取 numbers 个元素
srem(name, values) 在name对应的集合中删除某些值
sunion(keys, *args) 获取多一个name对应的集合的并集
sunionstore(dest,keys, *args) 获取多一个name对应的集合的并集,并将结果保存到dest对应的集合中
sscan_iter(name, match=None, count=None) 同字符串的操做,用于增量迭代分批获取元素,避免内存消耗太大
在集合的基础上,为每元素排序;元素的排序须要根据另一个值来进行比较,因此,对于有序集合,每个元素有两个值,即:值和分数,分数专门用来作排序。
zadd(name, *args, **kwargs) 在name对应的有序集合中添加元素
zcard(name) 获取name对应的有序集合元素的数量
zcount(name, min, max) 获取name对应的有序集合中分数 在 [min,max] 之间的个数
zincrby(name, value, amount) 自增name对应的有序集合的 name 对应的分数
r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)
zrank(name, value)
zrangebylex(name, min, max, start=None, num=None)
zrem(name, values)
zremrangebyrank(name, min, max) 根据排行范围删除
zremrangebyscore(name, min, max) 根据分数范围删除
zremrangebylex(name, min, max) 根据值返回删除
zscore(name, value) 获取name对应有序集合中 value 对应的分数
zinterstore(dest, keys, aggregate=None)
zunionstore(dest, keys, aggregate=None)
zscan_iter(name, match=None, count=None,score_cast_func=float) 同字符串类似,相较于字符串新增score_cast_func,用来对分数进行操做
delete(*names) 根据name删除redis中的任意数据类型
exists(name) 检测redis的name是否存在
keys(pattern='*')
expire(name ,time) 为某个redis的某个name设置超时时间
rename(src, dst) 对redis的name重命名
move(name, db) 将redis的某个值移动到指定的db下
randomkey() 随机获取一个redis的name(不删除)
type(name) 获取name对应值的类型
scan(cursor=0, match=None, count=None)
scan_iter(match=None, count=None) 同字符串操做,用于增量迭代获取key
redis-py默认在执行每次请求都会建立(链接池申请链接)和断开(归还链接池)一次链接操做,若是想要在一次请求中指定多个命令,则可使用pipline实现一次请求指定多个命令,而且默认状况下一次pipline 是原子性操做。
发布者:服务器
订阅者:Dashboad和数据处理
Demo以下:
订阅者:
发布者: