Redis的安装&Python

53 篇文章 1 订阅
12 篇文章 0 订阅

Redis

Redis是一种**数据结构服务器(data structure server)。

和memcached类似,Redis服务器的所有数据都是基于内存的(现在也可以选择把数据存放在磁盘)。

不同于memcached,Redis可以实现:

  1. 存储数据到磁盘,方便断电重启和提升可靠性
  2. 保存旧数据
  3. 提供多种数据结构,不限于简单字符串

Redis的数据类型和Python很相近,Redis服务器会是一个或多个Python应用程序之间共享数据的非常有帮助的中间件

Redis的安装

Windows下安装

  1. 安装包
  2. 开启设置Redis服务
# redis-server 以及 配置文件redis.windows-service.conf都在目录下
redis-server --service-install redis.windows-service.conf --loglevel verbose
  1. redis服务常用命令
    • 卸载服务 redis-server --service-uninstall
    • 开启服务 redis-server --service-start
    • 停止服务 redis-server --service-stop

Redis的配置

设置最大占用内存

Redis设置最大占用内存,打开redis配置文件,找到如下段落,设置maxmemory参数,maxmemory是bytes字节类型,注意转换。

# In short... if you have slaves attached it is suggested that you set a lower
# limit for maxmemory so that there is some free RAM on the system for slave
# output buffers (but this is not needed if the policy is 'noeviction').
#
# 设置最大缓存为256MB
# maxmemory <bytes>
maxmemory 268435456

使用Redis

Cli 使用 Redis

连接Redis

远程: redis-cli -h host -p port -a password
本地: redis-cli

常用

  1. 查看所有键:keys *
  2. 获取总键数:dbsize
  3. 检查键是否存在:exists <my-key>
  4. 删除键: del <my-key>/[<my-key>]
  5. 键类型:type key
  6. 取值:get <my-key>
  7. 目前Redis的状态:info

Python 使用 Redis

Python的Redis驱动程序redis-py在Github托管代码和测试用例,也可以在此参考在线参考文档

可以使用这条命令安装: pip install redis

使用

字符串

具有单一值一个键被称作Redis的字符串。简单的Python数据类型可以自动转换成Redis字符串

# 现在连接到一些主机(默认localhost)以及端口(默认6379)上的Redis服务器
>>> import redis
# 下面句子等价于redis.Redis('localhost')或者redis.Redis('localhost', 6379)
>>> conn = redis.Redis()
# 展示所有已有的keys
>>> conn.keys('*')
[]
>>> conn.set('secret', 'ni!')
True
>>> conn.set('carats', 24)
True
>>> conn.set('fever', 101.5)
True
>>> conn.get('secret')
'ni!'
>>> conn.get('carats')
'24'
>>> conn.get('fever')
'101.5'
# setnx()方法只有当键不存在时才设定值
>>> conn.setnx('secret', 'icky-icky-icky-ptang-zoop-boing!')
False
# getset()方法会返回旧的值,同时赋予新的值
>>> conn.get('secret', 'icky-icky-icky-ptang-zoop-boing!')
'ni!'
>>> conn.get('secret')
'icky-icky-icky-ptang-zoop-boing!'
# 使用函数getrange()得到子串(偏移量offset: 0代表开始,-1代表结束)
>>> conn.getrange('secret', -6, -1)
'boing!'
# 使用函数setrange()替代子串(从开始位置偏移)
>>> conn.setrange('secret', 0, 'ICKY')
32
>>> conn.get('secret')
'ICKY-icky-icky-ptang-zoop-boing!'
# 使用函数mset()一次设置多个键值
>>> conn.mset({'pie': 'cherry', 'cordial': 'sherry'})
True
# 使用函数mget()一次取到多个键的值
>>> conn.mget(['fever', 'carats'])
['101.5', '24']
# 使用函数delete()删掉一个键
>>> conn.delete('fever')
True
#使用函数incr()或者incrbyfloat()增加值,函数decr()减少值
>>> conn.incr('carats')
25
>>> conn.incr('carats', 10)
35
>>> conn.decr('carats')
34
>>> conn.decr('carats', 15)
19
>>> conn.set('fever', 101.5)
True
>>> conn.incrbyfloat('fever')
102.5
>>> conn.incrbyfloat('fever', 0.5)
103.0
#不存在函数decrbyfloat(),可以用增加负数代替
>>> conn.incrbyfloat('fever', -2.0)
101.0
列表

Redis的列表仅能包含字符串。当第一次插入数据时列表被创建。

第10章会介绍如何使用Redis列表以及发布-订阅(publish-subscribe)用于实现任务队列。

# 使用函数lpush()在开始处插入
# 'zoo'是列表名称
>>> conn.lpush('zoo', 'bear')
1
>>> conn.lpush('zoo', 'alligator', 'duck')
3
# 使用linsert()函数在一个值的前或者后插入
>>> conn.linsert('zoo', 'before', 'bear', 'beaver')
4
>>> conn.linsert('zoo', 'after', 'bear', 'cassowary')
5
# 上面指令得到['duck', 'alligator', 'beaver', 'bear', 'cassowary']
# 使用lset()函数在偏移量处设置新值(列表必须已经存在)
>>> conn.lset('zoo', 2, 'marmoset')
True
# 上面指令得到['duck', 'alligator', 'marmoset', 'bear', 'cassowary']
# rpush()函数在结尾处插入
>>> conn.rpush('zoo', 'yak')
6
# 使用lindex()函数取到给定偏移量处的值
>>> conn.lindex('zoo', 3)
'bear'
# 使用lrange()函数去到给定偏移范围的所有值
>>> conn.lrange('zoo', 0, 2)
['duck', 'alligator', 'marmoset']
# 使用ltrim()函数仅保留列表中给定范围的值
>>> conn.ltrim('zoo', 1, 4)
True
# 上面操作后,zoo列表变为['alligator', 'marmoset', 'bear', 'cassowary']
# 使用函数lrange()得到一定范围的值
>>> conn.lrange('zoo', 0, -1)
['alligator', 'marmoset', 'bear', 'cassowary']
哈希表

Redis的哈希表类似于Python字典,但它仅包含字符串,因此只能有一层结构,不能进行嵌套。

# 使用函数hmset()在哈希表song设置字段do和字段re的值
>>> conn.hmset('song', {'do': 'a deer', 're': 'about a deer'})
True
# 使用函数hset()设置一个单一字段值
>>> conn.hset('song', 'mi', 'a note to follow re')
1
# 使用函数hget()取到一个字段的值
>>> conn.hget('song', 'mi')
'a note to follow re'
# 使用函数hmget()取到多个字段的值
>>> conn.hmget('song', 're', 'do')
['about a deer', 'a deer']
# 使用函数hkeys()取到所有字段的键
>>> conn.hkeys('song')
['do', 're', 'mi']
# 使用函数hvals()得到所有字段的值
>>> conn.hvals('song')
['a deer', 'about a deer', 'a note to follow re']
# 使用函数hlen()返回字段的总数
>>> conn.hlen('song')
3
# 使用函数hgetall()取到所有字段的键和值
>>> conn.hgetall('song')
{'do': 'a deer', 're': 'about a deer', 'mi': 'a note to follow re'}
# 使用函数hsetnx()对字段中不存在的键赋值
>>> conn.hsetnx('song', 'fa', 'a note that rhymes with la')
1
集合

Redis的集合和Python的集合是完全类似的。

>>> conn.sadd('zoo', 'duck', 'goat', 'turkey')
3
# 取得集合中的所有值的数目
>>> conn.scard('zoo')
3
# 返回集合中的所有值
>>> conn.smembers('zoo')
{'duck', 'goat', 'turkey'}
# 从集合中删掉一个值
>>> conn.srem('zoo', 'turkey')
True
# 新建一个集合以展示一些集合间的操作
>>> conn.sadd('better_zoo', 'tiger', 'wolf', 'duck')
0
# 返回集合zoo和集合better_zoo的交集
>>> conn.sinter('zoo', 'better_zoo')
{'duck'}
# 获得集合zoo和集合better_zoo的交集,并存储到新集合fowl_zoo
>>> conn.sinterstore('fowl_zoo', 'zoo', 'better_zoo')
1
>>> conn.smembers('fowl_zoo')
{'duck'}
# 返回集合zoo和集合better_zoo的并集
>>> conn.sunion('zoo', 'better_zoo')
{'duck', 'goat', 'wolf', 'tiger'}
# 返回集合zoo和集合better_zoo的差集
>>> conn.sdiff('zoo', 'better_zoo')
{'goat'}
>>> conn.sdiffstore('zoo_sale', 'zoo', 'better_zoo')
1
>>> conn.smembers('zoo_sale')
{'goat'}
有序集合

Redis中功能最强大的数据类型之一是有序表(sort set或者zset)。它里面的值都是独一无二的,但是每一个值都关联对应浮点值分数(score)。可以通过值或者分数取得每一项,有序集合有很多用途:

  • 排行榜
  • 二级索引
  • 时间序列(把时间戳作为分数)

我们把最后一个(时间序列)作为例子,通过时间戳跟踪用户的登陆。在这里,时间表达使用Unix的epoch的值,它由Python的time()函数返回:

>>> import time
>>> now = time.time()
>>> conn.zadd('logins', 'smeagol', now)
1
>>> conn.zadd('logins', 'sauron', now+(5*60))
1
>>> conn.zadd('logins', 'bilbo', now+(2*60*60))
1
>>> conn.zadd('logins', 'treeebeard', now+(24*60*60))
1
# 查看bilbo登陆的次序
>>> conn.zrank('logins', bilbo')
2
# 查看bilbo登陆的时间
>>> conn.zscore('logins', 'bilbo')

# 按照等咯的顺序查看每一位访客
>>> conn.zrange('logins', 0, -1)
['smeagol', 'sauron', 'bilbo', 'treebeard']

# 按照等咯的顺序查看每一位访客并附带他们的登陆时间
>>> conn.zrange('logins', 0, -1, withscore = True)
位图

位图(bit)是一种非常省空间且快速的处理超大集合数字的方式

假设你有一个很多用户注册的网站,想要跟踪用户的登陆频率、在某一天用户的访问量以及同一用户在固定时间内的访问频率,等等。

当然,你可以使用Redis集合,但如果使用递增的用户ID,位图的方法更加简洁和快速。

# 首先为每一天创建一个为集合(bitset)。为了测试,我们仅使用3天和部分用户ID
>>> days = ['2013-02-25', '2013-02-26', '2013-02-27']
# 三个用户ID
>>> big_spender = 1089
>>> tire_kicker = 40459
>>> late_joiner = 550212
# 第一天的访问情况
>>> conn.setbit(days[0], big_spender, 1)
0
>>> conn.setbit(days[0], tire_kicker, 1)
0
# 第二天的访问情况
>>> conn.setbit(days[1], big_spender, 1)
0
# 第三天的访问情况
>>> conn.setbit(days[2], big_spender, 1)
0
>>> conn.setbit(days[2], late_joiner, 1)
0
# 现在统计得到这三天的日访客数
>>> for day in days:
...     conn.bitcount(day)
...
2
1
2
# 查看某一天某个用户是否有访问记录?
>>> conn.getbit(days[1], tire_kicker)
0
# 有多少访客每天都会访问?
>>> conn.bitop('and', 'everyday', *days)
68777
>>> conn.bitcount('everyday')
1
# 他是谁?
>>> conn.getbit('everyday', big_spender)
1
# 这三天中独立的访客数量有多少?
>>> conn.bittop('or', 'alldays', *days)
68777
>>> conn.bitcount('alldays')
3
缓存和过期

所有的Redis键都有一个生存期或者过期时间(expiration date),默认情况下,生存期是永久的。也可以使用expire()函数构造Redis键的生存期,下面看到的设置值是以秒为单位的数。

>>> import time
>>> key = 'now you see it'
>>> conn.set(key, 'but not for long')
Ture
>>> conn.expirt(key, 5)
True
>>> conn.ttl(key)
5
>>> conn.get(key)
'but not for long'
>>> time.sleep(6)
>>> conn.get(key)
>>>

expireat()命令给一个键设定过期时间,对于更新缓存是有帮助的,并且可以限制登录会话。

各种数据结构的说明

  1. https://redis.io/topics/data-types)
  2. https://redis.io/topics/data-types-intro

各种数据结构操作的复杂度

redis中内存消耗优化

其它用法

  1. http://blog.csdn.net/zhou_1997/article/details/52624468
  2. http://blog.csdn.net/kongxx/article/details/50952090
  3. http://www.cnblogs.com/Eva-J/p/5152841.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值