Redis基础
Redis
redis简介
- Redis 是完全开源免费的,是一个高性能的key-value数据库(非关系型数据库,不支持sql)。
- 
    Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 
- 
    Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 
- 
    Redis支持数据的备份,即master-slave模式的数据备份。 
- Redis服务端和客户端命令
服务端:redis-server
客户端:
- 
    redis-cli 
- 
    redis数据库默认为16个,没有名称,通过0-15来标识,连接Redis默认选择第一个数据库,可切换数据库,如 select 9,切换到第10个数据库
redis数据操作
redis是key-value的数据结构,每条数据都是一个键值对
- 
    键的类型是字符串且不能重复 
- 
    值的类型有5种 
- 
    字符串string 
- 
    哈希hash 
- 
    列表list 
- 
    集合set 
- 
    有序集合zset 
- 
    数据操作行为:增加、修改、获取、删除 
string类型
Redis中字符串类型的value最大可以容纳的数据长度是512M
增加、修改
设置键值:set key value,键不存在为添加,键存在为修改;例:set name sima
设置键值及过期时间(以秒为单位):setex key seconds value;例:setex name 3 sima
设置多个键值:mset key1 value1 key2 value2;例:mset a1 python a2 java
给某个键追加值:append key value;例:append a1 NB,追加后,a1的值为pythonNB
获取
获取指定键的值:get key
根据多个键获取多个值:mget key1 key2...
针对键的命令
查找键:keys pattern,支持正则表达式
查找所有键:keys *
查找名称中包含a的键:keys *a*
判断键是否存在:exists key
查看键对应的value的类型:type key
删除指定键及对应的值:del key1 key2 ...
给指定的键设置过期时间:expire key seconds
查看键的有效时间:ttl key
hash类型
用于存储对象,对象的结构为属性、值(字符串)
增加、修改
设置单个属性:hset key field value;例:hset user name sima
设置多个属性:hmset key field1 value1 field2 value2
获取
获取指定键所有的属性:hkeys key
获取指定键的某个属性的值:hget key field1
获取多个属性的值:hmget key field1 field2...
获取所有属性的值:hvals key
删除
删除整个hash键及值:del key
删除属性,属性对应的值也会被删除:hdel key filed1 field2...
list类型
list中的元素是string类型
按照插入顺序进行排序
增加
从左侧插入数据:lpush key value1 value2…;例:lpush a1 a b c
此时a1的值里面的元素顺序:
c, b, a
从右侧插入数据:rpush key value1 value2;例:rpush a1 0 1
此时a1的值里面的元素顺序:
c, b, a, 0, 1
从指定元素的前或后插入新元素:linsert key before/after 现有元素 新元素,例:linsert a1 b 6
此时a1的值里面的元素顺序:
c, 6, b, a, 0, 1
获取
返回列表里指定范围的元素:lrange key start stop,例:获取a1的值的所有元素lrange a1 0 -1
- 
    start,stop为元素的下标索引; 
- 
    索引从左侧开始,第一个元素的索引为0; 
- 
    索引可以是负数,表示从尾部开始计数 
设置指定索引位置的元素值
lset key index value`,例:修改a1中下标为1的元素的值为s,`lset a1 1 s
删除指定元素
将列表中前count次出现的值为value的元素删掉:lrem key count value
- 
    count>0,从头往尾进行删除 
- 
    count<0,从尾往头进行删除 
- 
    count=0,全部删除 
set类型
- 
    set类型为无序集合 
- 
    元素为string类型 
- 
    元素具有唯一性 
- 
    集合没有修改操作 
增加
sadd key m1 m2`,例:`sadd name john jack mary
获取
smembers key`,例:`smembers name
删除
删除指定元素:srem key m,例:srem name john
zset类型
- 
    有序集合 
- 
    元素为string类型 
- 
    元素具有唯一性,不重复 
- 
    每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序 
- 
    没有修改操作 
增加
zadd key score1 member1 score2 member2`,例:`zadd name 3 jack 5 mary 2 pink
获取
- 
    返回指定范围内的远: zrange key start stop,例:zrange name 0 -1(获取name集合的所有元素)
- 
    返回score值在min和max之间的元素: zrangebyscore key min max,例:zrangebyscore name 2 3
- 
    返回元素的score值: zscore key member,例:zscore name mary
删除
- 
    删除指定元素: zrem key m1 m2...
- 
    删除权重在指定范围内的元素: zremrangebyscore key min max
Redis服务
####set_key/get_key方法:基础redis存取服务
# redis_service.py
import cPickle
import hashlib
import json
import cache_key
import config
from core.base.cache.redis_sync import RedisSynchronizeService
from environment import environment as ev
class RedisService(object):
  """ Redis服务
      set_key/get_key:基础redis存取服务
      set_obj/get_obj:对象存取服务
      set_obj_key/get_obj_key:以对象为key存取
  """
  def __init__(self):
    pass
  @classmethod
  def set_key(cls, key, value):
    return ev.redis.set(key, value)
  @classmethod
  def get_key(cls, key):
    return ev.redis.get(key)
set_key方法会调用Environment()的redis方法
class Environment(object):
  ...
  def _init_redis_(self):
   _redis_address = self.conf.get_conf('hcm_cloud', 'redis')
   [logging.info](http://logging.info/)('init redis with {}'.format(_redis_address))
   self.r = redis.StrictRedis.from_url(_redis_address)
  ...
  @property
  def redis(self):
   return self.r
StrictRedis类是一个redis客户端类,StrictRedis的from_url方法返回从给定URL配置的Redis客户端对象。
@classmethod
  def from_url(cls, url, db=None, **kwargs):
    connection_pool = ConnectionPool.from_url(url, db=db, **kwargs)
    return cls(connection_pool=connection_pool)
该方法中会创建连接池
通常情况下, 当我们需要做redis操作时, 会创建一个连接, 并基于这个连接进行redis操作, 操作完成后, 释放连接,
一般情况下, 这是没问题的, 但当并发量比较高的时候, 频繁的连接创建和释放对性能会有较高的影响
于是, 连接池就发挥作用了
连接池的原理是, 通过预先创建多个连接, 当进行redis操作时, 直接获取已经创建的连接进行操作, 而且操作完成后, 不会释放, 用于后续的其他redis操作
这样就达到了避免频繁的redis连接创建和释放的目的, 从而提高性能了
得到的redis客户端类对象,拥有不同的⽅法可以调⽤,与前⾯redis命令对应