Memcached是一个高性能的分布式的内存对象缓存系统,用来分担数据库的压力。Memcached可以存储各种各样的数据,包括图像,视频,文件以及数据库检索的结果等等,简单来说就是将数据存储到内存中,然后再从内存中读取,从而大大提高读取速度。实际是不会将二进制文件直接存储到Memcached中的,只存储二进制文件的路径。
Memcached经常被用于以下情况:存储验证码、图形验证码、短信验证码、登录session等所有不是至关重要的数据。
Windows: (尽量使用管理员模式来安装)
不在管理员下运行会报错:
failed to install service or service already installed
如果出现提示信息,缺失pthreadGC2.dll文件,将其拷贝到C:\Windows\System32
下即可0
参考和文件下载:https://commaster.net/content/installing-memcached-windows
memcached没有提供windows下的安装包,需要自己编译
memcached.exe -d install
memcached.exe -d start
Linux(Ubuntu):
sudo apt-get install memcached
sudo service memcached start
Linux如果想要指定参数,就不能使用上面的方式启动,而应该使用下面的方法来运行
/usr/bin/memcached 参数(需要指定-u 用户)
如:
/usr/bin/memcached -u memcached -m 1024 -p 11212 -d start
-d
这个参数是让memcached在后台运行-m
指定占用多少内存,以M为单位,默认64M-p
指定占用端口,默认使用11211端口-l
其它机器可以通过哪个ip地址连接本机的memcached,如果Linux使用service方式启动的话,那么只有本机可以访问,其他机器不行,如果需要其他机器访问,则设置参数-l
为0.0.0.0
语法:
telnet ip port
如:
telnet 127.0.0.1 11211
------------------------------------
set username 0 60 3 # 60:过期时间 3:长度
abc
------------------------------------
get username
参考:https://blog.csdn.net/codetomylaw/article/details/43015295
替换
语法:
replace key flas timeout value_length
value
示例:
replace username 0 80 7
yingjoy
给对应的值加上一定的值
语法
incr key add
示例:
set age 0 120 2
18
----------------
incr age 2
----------------
get age
20
对应decr,进行减操作
append key datablock status
prepend key datablock status
get_hists
获取命中多少次get_misses
获取get空的次数curr_items
当前memcached中键值对的个数total_connections
从memcached
开启到现在总共的连接数curr_connections
当前连接数python-memcached
pip install python-memcached
import memcache
mc = memcache.Client(['192.168.1.200', '11211'], debug=True)
# 这里可以分布式,在list后面再添加memcached服务器即可
mc.set('welcome', 'hello world', time=60*5)
mc.set_multi({'username':'ying', 'age':18}, time=60*5)
result = mc.get_multi(['welcome', 'username', 'age'])
print(result)
# 这里result是字典类型
mc.delete('welcome')
result = mc.get('welcome')
print(result)
mc.incr('age', delta=1)
result = mc.get('age')
print(result)
mc.decr('age', delta=10)
result = mc.get('age')
print(result)
分布式的时候,存的值是按照memcached的算法分配的,不同字段会在集群上不同的机器上存储。
由于Memcached登录的时候不需要输入用户名和密码,只需直到memcached服务器的ip和端口号即可,导致不安全,下面是解决方案:
-l
参数不使用0.0.0.0
设置仅允许本地可以连接一般Memcached都在内网使用,不会在公网使用。
Redis是一种NoSQL
数据库,他们的数据是保存在内存中,同时Redis也可以定时的把内存数据同步到磁盘中,即可以将数据持久化,并且他比Memcached支持更多的数据结构,(string, list[队列和栈], set[集合], sorted set[有序集合], hash(hash表))。参考文档:
http://redisdoc.com/index.html
Memcached | Redis | |
---|---|---|
类型 | 纯内存缓存系统(数据库) | 内存磁盘同步数据库 |
数据类型 | 在定义value时需要固定数据类型 | 不需要 |
虚拟内存 | 不支持 | 支持 |
过期策略 | 支持 | 支持 |
存储数据安全 | 不支持 | 可以将数据同步到dump.db |
灾难恢复 | 不支持 | 可以将磁盘中的数据恢复到内存中 |
分布式 | 支持 | 主从同步 |
发布与订阅 | 不支持 | 支持 |
建议在Linux系统
yum install gcc
wget http://download.redis.io/releases/redis-4.0.2.tar.gz
tar xzf redis-4.0.2.tar.gz
cd redis-4.0.2
make
make install
后台运行:
https://blog.csdn.net/ksdb0468473/article/details/52126009
添加环境遍历
vim /etc/profile
------------------------------
PATH=$PATH:/usr/local/bin
export PATH
------------------------------
source /etc/profile
redis-server /usr/local/bin/redis.conf
redis-cli -h [ip] -p [port]
-----------------------------------
127.0.0.1:6379>
set key value
eg:
set username ying
当值为字符串且有空格时,使用单/双引号包裹set welcome "hello world"
get key
eg:
get username
del key
eg:
del username
expire key timeout(秒)
eg:
set username 5
1. set key value EX timeout
2. setex key timeout value
eg:
set username ying EX 5
setex username 5 ying
如果没有指定过期时间,则默认不过期
ttl key
eg:
ttl username
可以查看key
距离过期还有多少秒
keys pattern
eg:
keys *
pattern:正则匹配
Redis的列表分左右表头
lpush key value
eg:
lpush user ying
将值列表key的表头。如果列表key不存在,一个空列表会被创建,然后再执行lpush操作,当key存在的时候,会报错。
可以添加多个值,多个值使用空格隔开
lpush user user1 user2
rpush key value
eg:
rpush user ying
将值插列表key的表尾。如果列表key不存在,一个空列表会被创建,然后再执行rpush操作,当key存在的时候,会报错。
lrange key start stop
返回列表中指定的区域,区间的偏移量是start和stop,如果要从左边的第一个到最后一个lrange key 0 -1
lpop key
rpop key
eg:
lpop user
rpop user
#### 移除并返回列表key的中间元素
lrem key count value
eg:
lrem user 3 ying
从左将删除key列表中,count个值为value的元素
如果要删除所有,则设置count为0
lindex key index
eg:
lindex user 4
这个索引是从0开始的
llen key
eg:
llen user
集合元素不能重复
添加元素的位置是随机的
sadd set value1 value2 ...
eg:
sadd user user1 user2
smembers set
eg:
smembers user
srem set member
eg:
srem user user1
scard set
eg:
scard user
sinter set1 set2
eg:
sinter user username
sunion set1 set2
eg:
sunion user username
sdiff set1 set2
eg:
sdiff user username
hset key field value
eg:
hset user username ying age 18
如果key不存在,则创建一个新的hash表,如果存在,则覆盖。
也可以使用hmset
hget key field
eg:
hget user username
hdel key field
eg:
hdel user age
hgetall key
eg:
hgetall user
hkeys key
eg:
hkeys user
hvals key
eg:
hvals user
hlen key
eg:
hlen user
Redis可以一次性执行多个命令,事务具有以下特点:
multi
以后执行的所有命令都会在这个事务中执行。
exec
discard
watch key
先进行监视,再进入事务,如果监听的值与事务中有误,则不会执行事务。如,在另一个窗口中重新修改事务中key的值。
uwatech
publish channel message
subscribe channel
Redis提供了两种数据备份的方式,一种是RDB,另一种是AOF。
redis.conf
文件中的所有save
选项就可以了。redis.conf
下的dir
以及rdbfilename
来指定的。默认是/var/lib/redis/dump.rdb
。appendonly yes
就可以了redis.conf
下的dir
以及appendfilename
来指定的。默认是/var/lib/redis/appendonly.aof
。reids.conf
配置文件中,将requirepass pasword
取消注释,并且指定你想设置的密码。auth password
命令进行授权。-a
参数指定密码进行连接。如果想要让其他机器连接本机的redis服务器,那么应该在redis.conf
配置文件中,指定bind 本机的ip地址。这样别的机器就能连接成功。不像是网上说的,要指定对方的ip地址。
pip insatll redis
from redis import Redis
xtredis = Redis('192.168.1.200', port='6379', password='123456')
xtredis.set('username', 'ying')
result = xtredis.get('username')
print(result)
xtredis.delete('username')
result = xtredis.get('username')
print(result)
xtredis.set('username', 'ying')
xtredis.set('username', 'yingjoy')
result = xtredis.get('username')
print(result)
xtredis.lpush('user', 'user1')
xtredis.lpush('user', 'user2')
xtredis.rpush('user', 'user3')
result = xtredis.lrange('user', 0, -1)
print(result)
和控制台操作是一样一样的~
redis支持事务操作,也就是一些操作只有统一完成,否则失败
pipeline = xtredis.pipeline()
pipeline.set('username', 'ying')
pipeline.set('age', 18)
pipeline.incr('age', 2)
pipeline.execute()
result = xtredis.keys('*')
print(result)
result = xtredis.get('age')
print(result)
----------------------------------
[b'user', b'username', b'age']
b'20'
模拟异步发送邮件功能
from redis import Redis
xtredis = Redis('192.168.1.200', port='6379', password='123456')
# 发布3条消息
for i in range(3):
xtredis.publish('email', '{}xxx@qq.com'.format(i))
from redis import Redis
xtredis = Redis('192.168.1.200', port='6379', password='123456')
# 订阅
ps = xtredis.pubsub()
ps.subscribe('email')
# 监听
while True:
# ps.listen() 返回一个生成器
for item in ps.listen():
if item['type'] == 'message':
# 获取邮箱
data = item['data']
# bytes 转 str
print(data.decode())