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