Redis基础

Redis

redis简介

  1. Redis 是完全开源免费的,是一个高性能的key-value数据库(非关系型数据库,不支持sql)。
  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

  • Redis支持数据的备份,即master-slave模式的数据备份。

  1. Redis服务端和客户端命令

服务端:redis-server

客户端:

  • redis-cli

  • redis数据库默认为16个,没有名称,通过0-15来标识,连接Redis默认选择第一个数据库,可切换数据库,如select 9,切换到第10个数据库

redis数据操作

redis是key-value的数据结构,每条数据都是一个键值对

  • 键的类型是字符串且不能重复

  • 值的类型有5种

  • 字符串string

  • 哈希hash

  • 列表list

  • 集合set

  • 有序集合zset

  • 数据操作行为:增加、修改、获取、删除

redis中文官网命令文档

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命令对应