redis

Posted wangjianhua1

tags:

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

一. redis概述

Redis是一种基于键值对的NoSQL数据库,它提供了对多种数据类型(字符串、哈希、列表、集合、有序集合、位图等)的支持,能够满足很多应用场景的需求。Redis将数据放在内存中,因此读写性能是非常惊人的。与此同时,Redis也提供了持久化机制,能够将内存中的数据保存到硬盘上,在发生意外状况时数据也不会丢掉。

目前,国内外很多著名的企业和商业项目都使用了Redis,包括:Twitter、Github、StackOverflow、新浪微博、百度、优酷土豆、美团、小米、唯品会等。

redis简介

Redis是REmote DIctionary Server(远程词典服务器)的缩写,是用ANSI C编写的高性能的key-value存储系统,与其他的key-value存储系统相比,Redis有以下一些特点:

  • 读写性能极高

  • 支持数据的持久化,可以使用内存(临时存储),也可以使用硬盘(永久存储)

  • 支持多种数据类型,包括:string、hash、list、set,zset、bitmap、hyperloglog等。

  • 支持主从复制(实现读写分析)以及哨兵模式(监控master是否宕机并自动调整配置)。

  • 支持分布式集群,可以很容易的通过水平扩展来提升系统的整体性能。

  • 基于TCP提供的可靠传输服务进行通信,很多编程语言都提供了Redis客户端支持。

缺点:速度相对于Memcached来说比较慢

redis的桌面图形化软件:Redis Desktop Manager,但是要收费。

Redis的应用场景

  1. 高速缓存 - 将不常变化但又经常被访问的热点数据放到Redis数据库中,可以大大降低关系型数据库的压力,从而提升系统的响应性能。

  2. 排行榜 - 很多网站都有排行榜功能,利用Redis中的列表和有序集合可以非常方便的构造各种排行榜系统。

  3. 商品秒杀/投票点赞 - Redis提供了对计数操作的支持,网站上常见的秒杀、点赞等功能都可以利用Redis的计数器通过+1或-1的操作来实现,从而避免了使用关系型数据的update操作。

  4. 分布式锁 - 利用Redis可以跨多台服务器实现分布式锁(类似于线程锁,但是能够被多台机器上的多个线程或进程共享)的功能,用于实现一个阻塞式操作。

  5. 消息队列 - 消息队列和高速缓存一样,是一个大型网站不可缺少的基础服务,可以实现业务解耦和非实时业务削峰等特性,这些我们都会在后面的项目中为大家展示。

Redis的安装和配置

  1. 使用oneinstack一键安装

  2. 使用Linux系统的包管理工具(如yum)来安装Redis

  3. 通过在Redis的官方网站下载Redis的源代码,解压缩解归档之后通过make工具对源代码进行构建并安装,在更新这篇文档时,Redis官方提供的最新稳定版本是Redis 5.0.4

    wget http://download.redis.io/releases/redis-5.0.4.tar.gz
    gunzip redis-5.0.4.tar.gz
    tar -xvf redis-5.0.4.tar
    cd redis-5.0.4
    make && make install

上面这些内容就是Redis的基本配置。如果想找一些参考书,《Redis开发与运维》是一本不错的入门读物,而《Redis实战》是不错的进阶读物。

 

二. linux中管理redis

  1. 使用oneinstack安装的redis默认路径/usr/local/redis,配置文件在/etc下面的redis.conf里面

  2. 默认端口是:3306

  3. redis中一共有16个数据库(0-15),默认数据库是0 ,选择数据库命令:select index

  4. 终端连接:redis-cli

    默认不识别中文,
    redis-cli --raw 后面加--raw可以让系统识别汉字,但是报错不会再提示,无返回

  5. 退出:exit|quit

  6. ,配置

    一,设置可以远程连接:
    1,打开配置文件:vim /usr/local/redis/etc/redis.conf
    2,将:bind 127.0.0.1     这顶注释掉
    意思是:绑定某个地址,如果bind 127.0.0.1没有被注释,那么不能进行远程访问
    bind 127.0.0.1 ::1 这个双冒号的,好像是关于ipv6的,因为ipv6很长,双冒号表示压缩。
    ?
    二:受保护的:-mode,默认值是yes,改为no
    ?
    三:守护进程:daemonize yes,默认值是yes,如果不是yes,就改为yes
    (daemonize:读作滴闷爱z)

  7. 修改密码

    方法1:登录redis后设置
    config set requirepass x:将密码设为x
    config set requirepass "":删除密码
    ?
    方法2:在配置文件里面设置
    打开配置文件:vim /usr/local/redis/etc/redis.conf
    在里面添加:requirepass 密码
    ?
    如果已经设置好密码,输入登录命令后,还需要输入密码,命令为:auth xxx

  8. 重启

    当配置项修改完毕以后,需要重启redis:
    service redis-server restart|start|stop|status
    ?
    ubuntu重启网卡命令:service networking restart

  9. 调试

    一,登录redis后输入:ping
    如果服务器运作正常的话,会返回一个 PONG
    ?
    二,通过ps或者netstat来检查Redis服务器是否启动成功
    ps -ef | grep redis-server
    netstat -nap | grep redis-server

 

三. redis中的数据类型

  1. Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)

string(字符串)

  • String是redis中最基本的数据类型,最大可以存储512M(这个值是可以设置的) String类型是二进制的,可以存储图片,存储数字,序列化....

  • command key value(字符串都是一对一的)

set key value:无则插,有则盖,
setnx key value:无则插,有则止,
setex key seconds value:设置指定时间的值,有则盖
psetex key seconds value:与setex一样,只不过时间更精确。
get key:返回指定键的值,无则返nil。(get命令只能用于字符串)
getset key value 将键 key 的值设为 value , 并返回key被设置之前的旧值。
strlen key:返回键 key 储存的字符串值的长度
append key value:无则插,有则加,但是增加的是value的长度。
setrange key offset value:从key的指定位置offset开始插入value。
getrange key start end:截取指定长度的字符串。
incr key:自加1
incrby key N:自加N.
incrbyfloat key N:自加N,N为浮点数。
decr key:自减1
decrby key :自减N
mset key value [key value …]:同时为多个键设置值,有则盖。
msetnx key value [key value …]:同时为多个键设置值,有则止。
mget key [key……]:同时返回多个值。

hash(哈希)

  • hash 是一个键值(key=>value)对集合。

    hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象

  • command key {a:1,b:2,c:3,d:4,e:5}

hset hash field value:设定一个值,无则插,有则盖。(表名.键名.值名)(可以覆盖值,但不能与其它类型的表冲突)
hsetnx hash field value:设定一个值,无则插,有则止。
hget hash field:返回哈希表中给定域的值。
hexists hash field:检查给定域 field 是否存在于哈希表 hash 当中。
hdel key field [field …]:删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
hlen key:返回哈希表 key 中域的数量。
hstrlen key field:返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度(string length)。
hincrby key field increment:为哈希表 key 中的域 field 的值加上增量 increment,相当于对给定域进行减法操作,但它首先得是数字,字符串是没办法操作的。
hincrbyfloat key field increment:为哈希表 key 中的域 field 加上浮点数增量 increment 。无则先为0,而后加。
hmset key field value [field value …]:在表key中插入多个域,有则盖。
hmget key field [field …]:返回哈希表 key 中,一个或多个给定域的值。
hkeys key:返回哈希表 key 中的所有域。
hvals key:返回哈希表 key 中所有域的值。
hgetall key:返回哈希表 key 中,所有的域和值。

list(列表)

  • 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

  • command key [a,b,c,d,e]

lpush key value [value …]:将一个或多个值 value 插入到列表 key 的表头
lpushx key value:将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表,当 key 不存在时, lpushx 命令什么也不做。
rpush key value [value …]:将一个或多个值 value 插入到列表 key 的表尾(最右边)。
rpushx key value:将值 value 插入到列表 key 的表尾,当且仅当 key 存在并且是一个列表,当 key 不存在时, rpushx 命令什么也不做。
lpop key:移除并返回列表 key 的头元素。
rpop key:移除并返回列表 key 的尾元素。
llen key:返回列表 key 的长度。
lindex key index:返回列表 key 中,下标为 index 的元素。
linset key BEFORE|AFTER pivot value:将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
lset key index value:将列表 key 中下标为 index 的元素的值设置为 value 。无则错。
lrange key start stop:返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
ltrim key start stop:截取列表中指定区间的值。

set(集合)

  • Set是string类型的无序集合。

    集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

  • command key [a,b,c,d,e](与列表相似,但是无序)

sadd key member [member …]:无序集合,在集合key中插入多个值,无则插,有则略。
sismember key member:判断memeber是否存在于key中。
spop key:随机移除并返回集合中的一个元素。
srandmember key [count]:随机返回集合中指定个数的值,如果不设定个数,则默认返回1个。
srem key member [member …]:移除集合中的一个或多个 member 元素,不存在的 member 元素会被忽略。
scard key:返回集合中元素的数量。
smembers key:返回集合中的所有元素。
sinter key [key …]:返回给定集合的交集。
sinterstore x key [key …]:返回给定集合的交集,并保存在x中。
sunion key [key …]:返回给定集合的并集。
suniontore x key [key …]:返回给定集合的并集,并保存在x中。
sdiff key [key …]:返回给定集合的差集,该差集是最左边的差集。
sdiffstore x key [key …]:返回给定集合的差集,并保存在x中,该差集是最左边的差集。

zset(sorted set:有序集合)

  • zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

  • zset的成员是唯一的,但分数(score)却可以重复。

zadd key score member [[score member]:插入一个或多个元素。无则插,有则盖。通过权重score来排序。
zscore key member:返回指定值的权重。
zincrby key increment member:增加指定值的权重increment(正负皆可)。
zcard key:返回有序集 key 的个数。
zcount key min max:返回key中指定权重区间的值的个数。
zrange key start stop:返回key中指定下标区间的值。成员位置按score值递增排序。
zrevrange key start stop:返回key中指定下标区间的值。成员位置按score值递减排序。
zrank key member:返回有序集 key 中指定值的下标,成员位置按score值递增排序.
zrem key member:移除一个或多个值。不存在则忽略

 

四. 数据库的操作

exists key:检查给定 key 是否存在。
type key:返回key的数据类型。
move key db:将当前数据库的 key 移动到给定的数据库 db 当中。
del key [key …]:删除给定的一个或多个 key
randomkey:从当前数据库中随机返回(不删除)一个 key 。
dbsize:返回当前数据库的 key 的数量。
keys pattern:查找所有符合给定模式 pattern 的 key 。(*代表一个,?代表所有)
sort key:对列表,集合,有序集合排序。(感觉不太好用,应该是我不熟练)
flushdb:清空当前数据库中的所有 key。
flushall:清空整个 Redis 服务器的数据
select index:切换到指定的数据库
swapdb db1 db2:对换指定的两个数据库的数据

 

五. 自动过期

expire key seconds:为指定 key 设置生存时间
ttl key:查看过期时间。
persist key:设定永不过期。

 

六. 持久化

bgsave:在后台异步(Asynchronously)保存当前数据库的数据到磁盘
lastsave:返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示。

 

七. python中使用redis

  1. 先下载:pip install redis

  2. 单入口连接

    1,导入redis模块
    import redis
    ?
    2,连接远程的redis服务器
    conn = redis.Redis(host=‘10.11.58.103‘,port=6379,db=0,decode_responses=True,password=‘123456‘)
    ?
    3,设置一个string
    conn.set(‘name‘,‘tom‘)
    ?
    4,获取值
    print(conn.get(‘name‘))

  3. 连接池连接

    1,导入redis模块
    import redis
    ?
    2,连接远程的redis服务器
    lj = redis.ConnectionPool(host = ‘10.11.54.149‘,port = 6379,db = 4,password = ‘x‘,decode_responses = True)
    ?
    3,对象实例化
    you = redis.Redis(connection_pool=lj)
    ?
    4,插入值
    you.set(‘z‘,‘boshi‘)
    you.hmset(‘abc‘,{‘a‘:1,‘b‘:2})
    ?
    5获取值
    a = you.get(‘z‘)
    print(a)

 


 

 


 

 


 

代码

与python连接

用字典形式插入
dict = dict(
name = "tom",
age = 18,
set
)
you.hmset("useinfo",dict)
?
?
用pickle形式插入,需要先从python导入import pickle
res = p.dumps(dict)
conn.setex("bcd",10,res)
?
打印刚才插入的值:
b.conn.get("bcd")
print(p.loads(b))
?
?
?
.set("a",dict)

杂七杂八

下载pymysql
pip3 install pymysql
whl
pip install redis-......whl
?
python download
pip download dlib 不用下,人工智能脸部识别的
?
?
pip freeze |grep -E "^r" 正则查找
或者pip list
?
?
pip install redis==2.10.6 下载指定版本
?
?
pip install -r desktop/xxx/xx/x/x.txt 下载指定文件的软件
?
?
在python中连接redis时,创建py文件不能与redis重名,否则会有问题

 

 

在window下安装时,在选择完安装路径后,后面有一个安装环境path,需要勾选一下
window的安装包与linux安装包不同。
如果想卸载,再点安装包,会有3个选择,第三个选项是卸载。

 

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

redis存储session配制方法

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

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

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

spring boot 整合 redis

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