缓存系统
mongodb 直接持久化,宕机数据不丢失
redis 半持久化,手动控制,NoSQL数据库
memcache 不能持久化,存储在内存中,轻量级缓存

 

radis 单线程应用,通过异步实现多访存
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,
包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。
区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis的安装

1 wget http://download.redis.io/releases/redis-3.0.6.tar.gz
2 tar xzf redis-3.0.6.tar.gz
3 cd redis-3.0.6
4 make

 

启动Radis

1 src/redis-server

 

客户端操作

 1 src/redis-cli
 2 redis> set name cq
 3 OK
 4 
 5 redis> get name
 6 "cq"
 7 
 8 redis> keys *
 9 1) "name"
10 
11 redis> set name cq ex 2     #kay-value只存活2s
12 redis> get name
13 (nil)
14 
15 #切换数据库(默认有0-15个)
16 #不同数据库key-vaule对相互隔离
17 redis> select 2
18 OK
19 
20 
21 #数据库间移动key-value对
22 #key必须是当前db中存在的,1 位置选定数据库
23 redis> move key 1
24 (integer) 1

 

Python操作Redis

1 sudo pip install redis
2 or
3 sudo easy_install redis
4 or
5 源码安装
6 
7 详见:https://github.com/WoLpH/redis-py

 

简单问题

 1 DENIED Redis is running in protected mode because 
 2 protected mode is enabled, 
 3 no bind address was specified, 
 4 no authentication password is requested to clients
 5 
 6 redis 2.10.6 版本,为了安全考虑,非本机连接redis时,要关闭保护模式,设置密码
 7 
 8 vim redis.conf
 9 protected-mode no
10 requirepass "123456"
11 #注意纯数字字符串用引号引起来
12 redis> config set requirepass 123456

 

身份认证

1 127.0.0.1:6379> set name cq
2 (error) NOAUTH Authentication required.
3 127.0.0.1:6379> auth 123456
4 OK

 

操作方式
redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。

import redis

r = redis.Redis(host="192.168.198.128", port='6379',password="123456",db=1)
r.set(name="k1", value="aaa")
res = r.get(name="k1")
print(res)

 

连接池
redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。

import redis

pool = redis.ConnectionPool(host='192.168.198.128', port=6379, password="123456")

r = redis.Redis(connection_pool=pool)
r.set(name="k1", value="aaa")
res = r.get(name="k1")
print(res)

 

各种操作

 

String操作

#String操作,redis中的String在在内存中按照一个name对应一个value来存储。

set(name, value, ex=None, px=None, nx=False, xx=False)
    # 在Redis中设置值,默认,不存在则创建,存在则修改
    # 参数:
       # ex,过期时间(秒)
       # px,过期时间(毫秒)
       # nx,如果设置为True,则只有name不存在时,当前set操作才执行
       # xx,如果设置为True,则只有name存在时,岗前set操作才执行

setnx(name, value)

setex(name, value, time)
    # time,过期时间(数字秒 或 timedelta对象)

psetex(name, time_ms, value)
    # time_ms,过期时间(数字毫秒 或 timedelta对象)

mset(*args, **kwargs)
    # mset(k1='v1', k2='v2')
    #
    # mget({'k1': 'v1', 'k2': 'v2'})

get(name)
    # 在Redis中获取值,不存在为空

mget(keys, *args)
    # mget('ylr', 'wupeiqi')
    #
    # r.mget(['ylr', 'wupeiqi'])

getset(name, value)
    # 设置新值并获取原来的值

getrange(key, start, end)
    # 获取子序列(根据字节获取,非字符)
    # key,Redis 的 name
    # start,起始位置(字节)
    # end,结束位置(字节)
    # ("key",0,1)   ->   ke

setrange(name, offset, value)
    # 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
    # offset,字符串的索引,字节(一个汉字三个字节),从哪里开始追加或替换字符串
    # value,要设置的值
    # ("key",0,"a")   key = value --->  key = aavlue

setbit(name, offset, value)
    # 对name对应值的二进制表示的位进行操作
    # 参数:
        # name,redis的name
        # offset,位的索引(将值变换成二进制后再进行索引)
        # value,值只能是 1 或 0
    # 注:如果在Redis中有一个对应: n1 = "foo",
            # 那么字符串foo的二进制表示为:01100110 01101111 01101111
            # 所以,如果执行 setbit('n1', 7, 1),则就会将第7位设置为1,
            # 那么最终二进制则变成 01100111 01101111 01101111,即:"goo"

getbit(name, offset)
    # 获取name对应的值的二进制表示中的某位的值 (0或1)

bitcount(key, start=None, end=None)
    # 获取name对应的值的二进制表示中 1 的个数
    # 非常高效的应用场景
        # bitcount统计一个字符二进制数1的个数
        # 使用 count 键名对应的value统计在线人数
        # 由于用户ID唯一,当一个用户登录时,setbit count (id) 1
        # 判断用户是否在线 getbit count id

bitop(operation, dest, *keys)
    # 获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值
    # 参数:
        # operation,AND(并) 、 OR(或) 、 NOT(非) 、 XOR(异或)
        # dest, 新的Redis的name
        # *keys,要查找的Redis的name
    # 如:
        bitop("AND", 'new_name', 'n1', 'n2', 'n3')
        # 获取Redis中n1,n2,n3对应的值,然后讲所有的值做位运算(求并集),然后将结果保存 new_name 对应的值中

strlen(name)
    # 返回name对应值的字节长度(一个汉字3个字节)

incr(self, name, amount=1)
    # 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
    # 参数:
        # name,Redis的name
        # amount,自增数(必须是整数)

decr(self, name, amount=1)
    # 自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。

    # 参数:
        # name,Redis的name
        # amount,自减数(整数)

incrbyfloat(self, name, amount=1.0)
    # 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
    # count = null ---> incrbyfloat(self, "count", "0.8")  ----> count = 0.8
    # incrbyfloat(self, "count", "0.8") ----> count = 1.6

append(key, value)
    # 在redis name对应的值后面追加内容
    # foo = aaa  --> append("foo","111")  --->  foo = aaa111
View Code

相关文章:

  • 2022-12-23
  • 2021-10-17
  • 2021-10-06
  • 2021-08-23
  • 2021-10-16
  • 2021-11-06
  • 2022-02-08
猜你喜欢
  • 2018-05-21
  • 2021-05-21
  • 2019-09-01
  • 2021-06-14
  • 2021-11-30
  • 2022-12-23
相关资源
相似解决方案