Redis

Posted Xu佩佩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis相关的知识,希望对你有一定的参考价值。

Redis相关

简介

首先我们要知道Redis是什么,他是一个数据库,是一个key-value型的数据库,或者说内存型的数据库.

Redis相对于其他key-value型的数据库有什么优点呢,大致可以分为以下三点:

  1. Redis支持数据的持久化,也就是说并不是简单的只存在于内存中,Redis是会把内存中的数据存储到磁盘中的,这样数据库重启的时候数据也不会丢失,可以再次加载使用.
  2. Redis支持多种类型的数据,除了最基础的key-value之外,还支持list,set,zset,hash等数据结构的存储.
  3. Redis还支持数据的备份,即master-slave模式的数据备份.
  4. Redis的性能极高,大概读的速度是110000次/s左右,写的速度是81000次/s左右.

所以,这些优点就决定了我们会经常使用redis数据库.

Redis的安装

windows下的安装

下载地址: https://github.com/MSOpenTech/redis/releases

里面有32位和64位的安装包,根据情况下载即可,文件名为Redis-x64-xxx.zip,解压后将文件重命名为redis即可.

# 安装完之后,我们通过cmd终端来进入解压好的文件夹,然后执行以下指令

# 启动服务:注意,启动之后cmd终端不能关闭,否则server会断开
redis-server
# 连接默认数据库
redis-cli
# 连接指定数据库 
redis-cli -h ip地址 -p 端口号 -n 数据库名
# eg:
redis-cli -h 127.0.0.1 -p 6379 -n 1
# 切换数据库
select 数据库名
# eg:
select 1

为了解决server端的cmd窗口一旦关闭server就会断开的问题,我们可以把redis安装成windows服务,步骤如下:

# 1. cmd窗口cd进入redis的文件夹,执行下面语句
redis-server --service-install redis.windows.conf
# 2. 安装好之后,用下面的语句启动服务
redis-server --service-start
# 3. 可以通过下面语句停止服务
redis-server --service-stop
# 4. 还可以通过下面语句卸载服务
redis-server --service-uninstall

linux下的安装

linux下输入以下指令:

wget http://download.redis.io/releases/redis-2.8.17.tar.gz
    
tar xzf redis-2.8.17.tar.gz
cd redis-2.8.17
make

# 上面执行完之后,就可以启动redis的server端了,进入安装目录的src目录下
cd src 
./redis-server

redis对五种数据类型的操作

字符串(String)

# 1. 设置指定key值 set key value
set today happy

# 2. 获取指定的key值 get key
get today
"happy"

# 3. 获取key中字符串的子字符串 getrange key start end
getrange today 0 2 
"hap"

# 4. 当key不存在时设置key的值, setnx key value
setnx today hap
(integer) 0 # 因为today存在,所以设置key值不成功,影响行数为0
setnx tomo 10
(integer) 1 # 因为tomo不存在,所以设置key-value成功,影响行数为1

# 5. 获取key所存储的字符串的长度 strlen key
strlen today
(integer) 5     # happy长度为5

# 6. 将key中储存的数字值减一(如果是数字的话) decr key
decr tomo 
(integer) 9
decr today      # 如果key对应的value值不是数字,会报错
(error) ERR value is not an integer or out of range

哈希(Hash)

# 1. 设置指定hash值, hmset hash表名 key1 value1 key2 value2 key3 value3
hmset redis name "redis" description "redis basic commands for caching" likes 20 visitors 23000

# 2. 获取指定的hash值, hgetall key
hgetall redis
1) "name"
2) "redis"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"

# 3. 获取hash表中所有key, hgetall 哈希表名
hgetall redis
1) "name"
2) "description"
3) "likes"
4) "visitors"

列表(List)

# 1. lpush 向列表内添加值, lpush key value 
lpush lis 1
lpush lis 2
lpush lis 3
lpush lis 4

# 2. 查看列表值 : lrange key start end
lrange lis 0 1000
1) "4"
2) "3"
3) "2"
4) "1"

# 3. 将一个值插入到已存在的列表头部:lpushx key value
lpushx lis 5

# 4. 移除列表最后一个元素: rpop key
rpop lis
"1"

集合(Set)

集合的特点在于可以自动去重,添加重复元素的时候会自动去除

# 1. 添加集合元素: sadd key value
sadd set1 a
sadd set1 b
sadd set1 c
sadd set1 a

# 2. 查看集合元素,注意,集合是无序的,并不是按我们存进去的顺序查出来的
smembers set1
1) "b"
2) "a"
3) "c"

# 3. 判断member元素是否是集合key的成员:sismember key member 
sismember set1 b
(integer) 1     # 存在b,就会返回1

有序集合(sorted set)

有序集合和集合相同的一点在于,同样不允许有重复的元素存在.

不同的是每个元素会关联一个double类型的分数(权重),这个分数就是redis对集合排序的依据.

# 1. 添加有序集合元素: zadd key score1 member1 [score2 member2] 同时如果member重复会更新其对应score的值
zadd sset1 1 a
zadd sset1 2 b
zadd sset1 3 c
zadd sset1 4 d
zadd sset1 5 a

# 2. 查看集合: zrange key 集合元素位置 withscores
zrange sset1 0 1 withscores
1) "b"
2) "2"
3) "c"
4) "3"

# 3. 返回有序集合中指定成员的索引: zrank key member
zrank sset1 a
(integer) 3

# 4. 移除有序集合里面给定的分数区间的所有成员: zremrangebyscore key min max 
zremrangebyscore sset1 0 2

redis在Python中的使用

首先,毫无疑问,我们需要安装redis模块

pip install redis

然后我们就可以直接使用redis来连接一个redis数据库,而且我们可以选择直接连接一个redis数据库或者建立一个连接池,有更多的用处

import redis

# 直接连接
r = redis.Redis(host = '127.0.0.1',port = 6379, db = 1)
'''
host是连接的数据库地址
port是连接的端口号
db是数据库的名字
'''


# 连接池连接
pool = redis.ConnectionPool(host = '127.0.0.1',port = 6379, db = 1,max_connections=100)
# 上面max_connections是连接池的最大连接数
r = redis.Redis(connection_pool = pool)


# 在建立完连接之后,我们就可以直接用r来点出来方法从而完成对redis数据库的操作,大概操作和本身的redis代码几乎完全一样

r.set('name','bob')
r.setex('name', 3, 'jerry')
print(r.get('name'))

r.rpush('stus', 's1', 's2', 's3')
print(r.lrange('stus', 0, 1000))

r.zadd('game', {'a': 10, 'b': 20, 'c': 15})
print(r.zrevrange('game', 0, 1))
print(r.zrange('game', 0, 1))

redis在Django中的使用

django中使用redis大多使用两种方法,即直接使用或者借用缓存cache来使用redis.

  1. 直接使用redis,单例或者连接池
# 在django的utils文件夹下,建立redis_pool.py,写入
import redis
POOL = redis.ConnectionPool('127.0.0.1',6379,max_connection = 100)

# 然后就可以在视图函数里面导入这个文件,使用其连接池的方法
from django.shortcuts import render, HttpResponse
import redis

# 写一个模块,写一个pool,导入
from app01.redis_pool import POOL


def setname(request):
    conn = redis.Redis(connection_pool=POOL)
    conn.set('name', 'bob')
    return HttpResponse('设置成功')


def getname(request):
    conn = redis.Redis(connection_pool=POOL)
    name = conn.get('name').decode('utf-8')
    return HttpResponse(name)
  1. 借用缓存的话需要安装django-redis模块
pip install django-redis

# 1. 在django里的settings.py里面配置缓存存储的位置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/11",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
        }
    }
}

# 2.操作cache模块直接操作缓存:views.py
from django.core.cache import cache  # 结合配置文件实现插拔式
# 存放token,可以直接设置过期时间,不加单位默认是秒
cache.set('token', 'header.payload.signature', 10)
# 取出token
token = cache.get('token')

以上是关于Redis的主要内容,如果未能解决你的问题,请参考以下文章

redis存储session配制方法

Redis实现分布式锁(设计模式应用实战)

Redis实现分布式锁(设计模式应用实战)

Redis缓存:java语言注释符号,附超全教程文档

spring boot 整合 redis

Redis 学习 —— 数据类型及操作