Redis

1.Redis配置文件详解

1.1. 配置文件所有路径

Ubuntu
/etc/redis/redis.conf

1.2设置连接密码

1、requirepass 密码
2. 注释掉本地IP绑定
# bind 127.0.0.1
3. 关闭保护模式(把yes改成no)
  protected-mode no
4. 重启服务
  sudo /etc/init.d/redis-server restart

2.数据类型

2.1.通用命令 适用于所有数据类型

# 切换库(number的值在 0 ~ 15之间)
select number
# 查看所有的键
keys 表达式 # keys * 
# 数据类型
type key
# 键是否存在
exists key
# 删除键
del key
# 重命名
rename key newkey
# 清除当前库的所有数据
flushdb
# 清除所有库中的所有数据
flushall

2.2.字符串

  • 特点

    1. 字符串,数字, 都会被转换成字符串来存储
    2. 以二进制的方式存储地内存中
    
  • 字符串常用命令

    # 1.设置一个 key - value
    set key value 
    # 2.获取key的值
    get key
    # 3.key 不存在时再设置
    set key value nx # not exists
    # 4.设置过期时间
    set key value ex seconds
    # 5.同时设置多个key - value
    mset key1 value1 key2 value2 key3 value3 ...
    # 6.同获取多个 key 的值
    mget key1 key2 key3 ...
    
  • 字符串常用命令2

    # 获取长度
    strlen key
    # 切片内容
    getrange key start stop # -1为结束位置
    # 从索引值开始替换内容
    setrange key index value
    # 追加数据
    append key value
    
  • 数值操作

    # 整数操作
    incrby key 步长
    decrby key 步长
    incr key # +1操作
    decr key # -1操作
    incrbyfloat key step
    
  • 键的命名规范

    mset user:name zhangsanfeng user:age 80 user:addr wudangshang
    

3.与python进行交互

  • 安装 redis python包

    pip3 install redis
    
  • 建立连

      # 安装 redis python 包
      # pip3 install redis
      In [1]: import redis 
      In [6]: r = redis.Redis(host='localhost', port=6379, db=0, password=None)                         In [7]: r.ping()                                                                                   Out[7]: True
    
  • 常用方法

    # 方法命名与指令非常相似
    
    通用方法
    # 查看所有的键 r.keys(pattern='*')  --> [b'key1', ...] 
    r.keys() # pattern 语法类似于正则
    # 数据类型 r.type(name) --> b'type'
    r.type(name)
    # 键是否存在 r.type(*names) --> 列表中有多少个键是存在的,
    r.exists('myname', 'spidy:urls', 'a', 'spidy:rusl1')   
    # 删除键 r.delete(*names) --> 返回删除键的个数
    r.delete('myname', 'spidy:urls', 'a')  
    # 重命名  rename(src, dst) / renamenx(src, dst), nx 如果dst不存在则重命名成dst --> BOOL
    # 如果指定为 nx 且 dst存在 返回 False
    # 如果 src 不存在 抛出 ResponseError 异常
    r.rename('spidy:urls', 'newspidy:urls')
    # 清除当前库的所有数据 flushdb() ,慎用
    
    # 清除所有库中的所有数据 flushall() ,慎用
    
    

    字符串方法

    # 1.设置一个 key - value
    # r.set(name, value, ex=None, px=None, nx=False, xx=False) -->True/None
    # ex: 过期时间 秒
    # px: 过期时间 毫秒
    # nx: 指定True时,仅当指定的 name 不存在时才设置
    # xx: 指定True时,仅当指定的 name 存在时才设置
    r.set('user2:name', 'zhouzhiruo') # True
    r.set('user2:name', 'sf.zhang', nx=True) # None
    r.set('user2:name', 'sf.zhang', xx=True) # True
    r.set('userx:name', 'sf.zhang', nx=True) # None
    # 2.获取key的值 r.get(name) -> b'value' / None
    r.get(name) # zhangsanfeng
    # 5.同时设置多个key - value, r.mset(mapping)
    # mapping 是一个字典, 字典的键和值必须都为字符串,或都可以转换为字符串的类型
    user = { 
             'user:name': 'zhangsanfeng', 
             'user:age': 50, 
             'user:email': 'sf.zhang@163.com' 
            } 
    r.mset(user) # --> True
    # 6.同获取多个 key 的值 r.mget(keys, *args)
    r.mget(['user:name','user:age','user:email']) # [b'zhangsanfeng', b'50', b'sf.zhang@163.com']
    
    # 7 获取长度 r.strlen(name)
    r.strlen("user:name") # 12
    # 8 切片内容 r.getrange(key, start, end)
    r.getrange("user:name", 0, -1)
    # 9 从索引值开始替换内容 r.setrange(name, offset, value)
    r.setrange("user:name", 0, '123')
    # 10 追加数据 r.append(key, value)
    r.append('user:name', '456')
    

    数值操作

    # 整数操作 增加 、 减少 , r.incr[by](name, amount=1) / r.decr[by](name, amount=1)
    # 如果指定的 name 不存在,相当于 r.set(name, amount)
    r.incr("user:age", 10) # --> 返回增加后的数值
    r.decr("user:height", 10)
    # incrbyfloat key step , r.incrbyfloat(name, amount=1.0) 
    # amount 可以是负数
    r.incrbyfloat('age' -10)  
    

4.列表类型

  • # 从列表头部压入元素 LPUSH
    LPUSH key value1 value2 value3 ...
    # 从列表尾部压入元素 RPUSH
    RPUSH key value1 value2 value3 ...
    # 从src尾部弹出一个元素,压入到dst的头部 RPOPLPUSH
    RPOPLPUSH src dst
    # 在列表指定元素后/前插入元素 LINSERT
    LINSERT KEY AFTER|BEFORE value newValue
    
  • # 查看元素
    LRANGE KEY start stop
    # 获取长度
    LLEN key
    
  • # 从头部弹出一个元素
    LPOP key
    # 从尾部弹出一个元素
    RPOP key
    # 从头部弹出一个元素, 列表为空/不存在 -> 阻塞, timeout = 0 永久阻塞
    BLPOP key timeout
    # 从尾部弹出一个元素, 列表为空/不存在 -> 阻塞, timeout = 0 永久阻塞
    BRPOP key timeout 
    # 保留指定元素
    LTRIM key start stop 
    LTRIM mylist 0 2 # 保留前3条记录
    
  • LSET KEY index newValue
    

5.python操作列表

# 增
# 从列表头部压入元素 lpush(name, *values)/ lpushx(name, value) --> 压入的个数
# lpushx: 指定的name存在时入压入
l.lpush('user:likes', 'pingpong', 'football', 'sining', 'dance')

# 从列表尾部压入元素 rpush(name, *values)/ rpushx(name, value) --> 压入的个数
# rpushx: 指定的name存在时入压入
r.lpush('user:likes', 'pingpong', 'football', 'sining', 'dance')

# 从src尾部弹出一个元素,压入到dst的头部 r.rpoplpush(src, dst)
r.rpoplpush('user:likes','user1:likes')
# 在列表指定元素后/前插入元素 r.linsert(name, where, refvalue, value) --> llen / -1
r.linsert('user:likes', 'before', 'dance', 'swiming')

#查
# 查看元素 lrange(name, start, end)
r.lrange('user:likes', 0, -1) 
# 获取长度 r.llen(name)
r.llen('user:likes')
# 删
# 从头部弹出一个元素 lpop(name)
r.lpop('user:likes')
# 从尾部弹出一个元素 rpop(name)
r.rpop('user:likes')
# 从头部弹出一个元素, 列表为空/不存在 -> 阻塞, timeout = 0 永久阻塞 
# blpop(keys, timeout=0)

# 从尾部弹出一个元素, 列表为空/不存在 -> 阻塞, timeout = 0 永久阻塞 
# brpop(keys, timeout=0)

# 保留指定元素 ltrim(name, start, end)

# 改 lset(name, index, value)

6.位图操作

1.命令

# 设置某一位上的值
setbit key offset value # offset 从0开始, value 只能是 0或1
# 获取某一位上的值
getbit key offset 
# 统计, start 和 end 单位是 byte (8bit)
bitcount key [start end]

2.应用场景

# 网站用户的上线次数统计(寻找活跃用户)
  用户名为key,上线的天作为offset,上线设置为1
# 示例
  用户名为 user1:login 的用户,今年第1天上线,第30天上线
	SETBIT user1:login 0 1
	SETBIT user1:login 29 1
	BITCOUNT user1:login

3.python代码

# setbit(name, offset, value)
r.setbit('user:login', 2, 1) 
# getbit(name, offset)
r.getbit('user:login', 2) 
# r.bitcount(key, start=None, end=None)
r.bitcount('user:login') 

7.HASH 散列数据类型

定义

1、由field和关联的value组成的键值对
2、field和value是字符串类型
3、一个hash中最多包含2^32-1个键值对

优点

1、节约内存空间
2、每创建一个键,它都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等)
3、键越多,redis数据库在储存附件管理信息方面耗费内存越多,花在管理数据库键上的CPU也会越多

缺点

1、使用二进制位操作命令:SETBIT、GETBIT、BITCOUNT等,如果想使用这些操作,只能用字符串键
2、使用过期键功能:键过期功能只能对键进行过期操作,而不能对散列的字段进行过期操作

基本操作命令

# 设置单个字段
HSET KEY field value
HSETNX KEY field value
# 设置多个字段
HMSET KEY field value field value ...
# 返回字段的个数
HLEN key
# 判断字段是否存在(不存在返回0)
HEXISTS KEY field
# 返回字段的值
HGET KEY field
# 返回多个字段的值
HMGET KEY field field ...
# 返回所有键值对(字段名 + 值)
HGETALL key
# 返回所有字段名
HKEYS key
# 返回所有值
HVALS key
# 删除指定字段
HDEL key field

#数值操作
HINCBY key filed increment # increment可以取小于0的值
HINCBYFLOAT kye field increment 

与python进行交互

# 1、更新一条数据的属性,没有则新建
hset(key, field, value) 
# 2、读取这条数据的指定属性, 返回字符串类型
hget(key, field)
# 3、批量更新数据(没有则新建)属性,参数为字典
hmset(key, mapping)
# 4、批量读取数据(没有则新建)属性
hmget(key, fields)
# 5、获取这条数据的所有属性和对应的值,返回字典类型
hgetall(key)
# 6、获取这条数据的所有属性名,返回列表类型
hkeys(key)
hvals(key)
# 7、删除这条数据的指定属性
hdel(key, *fields)

8.mysql + hash案例(用户信息管理)

实现原理

用户想要查询个人信息
1、到redis缓存中查询个人信息
2、redis中查询不到,到mysql查询,并缓存到redis
3、再次查询个人信息

代码实现


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值