启动

最简启动

命令行输入

redis-server     # 使用默认配置

验证

ps-ef I grep redis
netstat-antpl I grep redis
redis-cli-h ip-p port ping

动态参数启动

redis-server -p 6380

配置文件启动

redis-server   /path/to/conf

常用配置

daemonize 是否是守护进程(nolyes)
port Redis 对外端口号
logfile  Redis系统日志
dir  Redis工作目录
config  get *

通用命令

  • keys

    keys *
    key 后面可以使用正则表达式,但是一般推荐在生产环境中使用这个命令
    
  • bdsize 计算key的总数

  • exists 判断是否存在

    存在就返回1,不存在就返回0
    
  • del key-value 删除指定的key-value 成功删除1 不存在0

  • expire

    expire key seconds    设置seconds秒后过期
    
  • ttl

    查看剩余的过期时间
    
  • persist

    去掉过期时间
    

-2 代表不存在 -1代表存在,但是没有设置过期时间

  • type

    type key 返回key的过期时间
    

上面的命令出了keys 是O(n),其他全都是O(1).

redis是单线程的

单线程为什么这么快?

1、纯内存2、非阻塞IO 3、避免线程切换和竟态消耗

一次只运行一次命令

拒绝长命令

字符串类型

字符串应用场景

缓存,分布式锁,计数器。

常用命令

get key 获取key对应的value值 时间复杂度为O(1)

set key value 设置key-value 时间复杂度为O(1)

del key 删除key-value 时间复杂度为O(1)

命令 作用 时间复杂度
incr key key自增1,如果key不存在,自增后get(key)=1 O(1)
decr key key自减1,如果key不存在,自减后get(key)=-1 O(1)
incry key k key自增k,如果key不存在,自增后get(key)=k decr key k O(1)
decr key k key自减k,如果key不存在,自减后get(key)=-k O(1)
命令 作用 时间复杂度
set key value 不管key是否存在,都设置 O(1)
setnx key value key不存在,才设置 O(1)
set key value xx key存在,才设置 O(1)
命令 作用 时间复杂度
mget keyl key2 key3... #批量获取key,原子操作 O(n)
mset keyl valuel key2 value2 key3 value3 #批量设置key-value
getset key newvalue #set key newvalue并返回旧的value O(1)
append key value #将value追加到旧的value O(1)
strlen key #返回字符串的长度(注意中文) O(1)
incrbyfloat key 3.5 #增加key对应的值3.5 O(1)
getrange key start end #获取字符串指定下标所有的值 O(1)
setrange key index value #设置指定下标所有对应的值 O(1)

哈希

Redis API

特点:

MapMap?

field不能相同,但是值可以相同

API

Redis API

Redis API

Redis API

Redis API

不常用的

Redis API

列表

Redis API

Redis API

Redis API

Redis API

Redis API

Redis API

Redis API

Redis API

Redis API

Redis API

集合

集合的特点:无序性,无重复,集合间操作

Redis API

sinter (求交集)

sdiff(求差集)

sunion(求并集)

scard 计数

sismember 判断是不是集合中的数据

srandmember 随机返回一个集合中的元素

spop随机删除一个集合中的元素

smember 返回所有的数据 小心使用这个API

有序集合

Redis API

和有序集合的对比

无序集合 有序集合 列表
重复值 无重复值 无重复值 可以有重复元素
有序无序 无序 有序 有序
存储 element score+element element

重要API

命令 作用 时间复杂度
zadd key score element 可以是多对 添加score和element O(logN)
zrem key element 可以是多个 删除指定元素 O(1)
zscore key element 返回指定元素的分数 O(1)
zincrby key increScore element 分数可以为负 增加或者减少元素的分数 O(1)
zcard key 返回元素的总个数 O(1)
zrange key start end [withscores] 返回指定索引范围内的升序元素[是否输出分值可选] O(logN + M)
zrangebyscore key minScore MaxScore [withscores] 返回指定索引分数内的升序元素[是否输出分值可选] O(logN + M)
zremrangebyrangk key start stop 删除指定排名内的升序元素 O(logN + M)
zremrangebyscore key minScore MaxScore 删除指定分数内的升序元素 O(logN + M)

redis 主从复制

127.0.0.1:6380> slaveof 11.11.11.11 6370 
OK (异步) 清空6380机器上的所有数据
127.0.0.1:6380> slaveof noone
ok 不会清除数据

配置文件

slaveof ip port 
slave-read-only yes

Redis API

redis配置

获取访问页面
localhost:5010/get

## ssdbadmin 网页上查看redis的数据内容

#是否作为守护进程运行
daemonize no
#Redis 默认监听端口
port 6379
#客户端闲置多少秒后,断开连接
timeout 300
#日志显示级别
loglevel verbose
#指定日志输出的文件名,也可指定到标准输出端口
logfile redis.log
#设置数据库的数量,默认最大是16,默认连接的数据库是0,可以通过select N 来连接不同的数据库
databases 32
#Dump持久化策略
#当有一条Keys 数据被改变是,900 秒刷新到disk 一次
#save 900 1
#当有10 条Keys 数据被改变时,300 秒刷新到disk 一次
save 300 100
#当有1w 条keys 数据被改变时,60 秒刷新到disk 一次
save 6000 10000
#当dump     .rdb 数据库的时候是否压缩数据对象
rdbcompression yes
#dump 持久化数据保存的文件名
dbfilename dump.rdb
###########    Replication #####################
#Redis的主从配置,配置slaveof则实例作为从服务器
#slaveof  ip host
#主服务器连接密码
# masterauth <master-password>
############## 安全性 ###########
#设置连接密码
#requirepass <password>
############### LIMITS ##############
#最大客户端连接数
# maxclients 128
#最大内存使用率
# maxmemory <bytes>
########## APPEND ONLY MODE #########
#是否开启日志功能
appendonly no
# AOF持久化策略
#appendfsync always
#appendfsync everysec
#appendfsync no
################ VIRTUAL MEMORY ###########
#是否开启VM 功能
#vm-enabled no
# vm-enabled yes
#vm-swap-file logs/redis.swap
#vm-max-memory 0
#vm-page-size 32
#vm-pages 134217728
#vm-max-threads 4

python连接redis提高效率

写单例

把连接放在单独的配置文件中,或者新建文件,在调用的时候从其他的地方导入过来

settings.py

import redis

POOL = redis.connectionpool(host ='127.0.0.1',port=6379,password='12',max_connections =1000)

其他

from settings import POOL

conn = redis.Redis(connection_pool = POOL)

在hgetall中如果,redis的内存过大,会发生爆栈的情况。

应该用hscan_iter(key,count)

列表操作

var = conn.blpop(k1,timeout = 10)