2019-11-27

Redis

redis

1.redis简介

redis的优点:

•  属于内存型的数据库,存储速度非常快

redis的缺点:

•  断电数据会丢失

•  redis服务挂掉之后数据也会丢失

Redis 这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作。原子操作:最小的操作单位,不能继续拆分。即最小的执行单位,不会被其他命令插入。高并发下不存在竞态条件。在多进程(线程)访问共享资源时,能够确保所有其他的进程(线程)都不在同一时间内访问相同的资源。原子操作(atomic operation)是不需要synchronized,这是Java多线程编程的老生常谈了。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。

2.redis的编译安装

2.1 下载redis源码包

wgethttp://download.redis.io/releases/redis-5.0.2.tar.gz

2.2 解压缩

tar-zxvfredis-5.0.2.tar.gz

2.3 切换redis源码目录

cdredis-4.0.10

2.4 编译源文件

make

2.5 编译好后,src/目录下有编译好的redis指令

2.6 make install 安装到指定目录,默认在/usr/local/bin

makeinstall

2.7 创建redis配置文件

mkdir-p/opt/redis_conf

cd/opt/redis_conf

vimredis-6379.conf

2.8添加以下配置

port6379# 运行在6379的redis数据库实例

daemonizeyes# 后台运行redis  

pidfile /data/6379/redis.pid# 存放redis pid的文件

loglevel notice# 日志等级

logfile"/data/6379/redis.log"# 指定redis日志文件的生成目录

dir /data/6379# 指定redis数据文件夹的目录

protected-modeyes# 默认yes,外部连接需配置绑定ip或设置访问密码

requirepass root  # 设置redis的密码,autho root验证登陆,不设则无需密码登陆

port6379

daemonizeyes

pidfile /data/6379/redis.pid      

loglevel notice                  

logfile"/data/6379/redis.log"

dir /data/6379                    

protected-modeyes

requirepass root          

2.9 启动redis

mkdir-p/data/6379            #创建日志文件夹

redis-server                  #直接启动redis服务端,默认端口6379

redis-server /opt/redis_conf/redis-6379.conf  #指定配置文件启动redis服务

netstat-tulp                  #查看redis是否开启

2.10 连接redis

redis-cli#连接redis数据库,默认连接端口6379

auth root  #auth 密码验证登陆

redis-cli-p6380-aroot#或者填上端口密码登陆

参数详解:

-p设置redis连接的端口

-a显式的填写密码-auth

--raw使用原始格式,避免中文乱码

127.0.0.1:6379 >ping#测试是否连接上redis,返回PONG表示连接上了

3 redis的数据类型

Redis数据类型分为:

    字符串类型、散列类型、列表类型、集合类型、有序集合类型。


1. string类型:

    字符串类型是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制安全的,也就是byte类型

    最大容量是512M。

2. hash类型:

        hash用于存储对象,对象的结构为属性、值,值的类型为string。

        key:{

           域:值[这里的值只能是字符串],

           域:值,            

           域:值,

           域:值,

           ...

        }

3. list类型:

        列表的元素类型为string。

        key:[ 值1,值2,值3..... ]

4.set类型:

    无序集合,元素为string类型,元素唯一不重复,没有修改操作。

    {值1,值4,值3,值5}

5. zset类型:

    有序集合,元素为string类型,元素唯一不重复,没有修改操作。   


3.1 key的操作

keys*          #查看所有key

setkey        #新建key

delkey        #删除key

keyspattern  #通配符有? * [] ^ - 和转义\

existskey    #存在返回1,不存在返回0

typekey        #返回key的数据类型,返回string/list/hash/set/zset

renameoldkey newkey    #对key重命名,如果newkey存在则覆盖

renamex oldkey newkey  #对key重命名,如果newkey存在则不覆盖

randomkey              #随机返回一个key

movekeydb-index      #将key移动到指定的数据库中,如果 key不存在或者已经在该数据库中,则返回0,成功则返回1。

flushall        #清空数据库

https://www.runoob.com/w3cnote/redis-intro-data-structure.html

keyspattern

支持的正则表达模式:

   h?llo 匹配 hello, hallo 和 hxllo

   h*llo 匹配 hllo 和 heeeello

   h[ae]llo 匹配 hello 和 hallo, 但是不匹配 hillo

   h[^e]llo 匹配 hallo, hbllo, … 但是不匹配 hello

   h[a-b]llo 匹配 hallo 和 hbllo

3.2 string类型

setkeyvalue  #赋值

getkey        #取值

mset k1 v1 k2 v2    #给多个key赋值

mget key1 key2      #获取多个key的值

appendkeyvalue    #追加

strlen  key        #获取长度

incrkey        #自增,

decrkey        #自减

incrbykeyn    #自增n

decrbykeyn  #自减n

#incr key:自增,就是Mysql的AUTO_INCREMENT。每次执行 INCR key时,该key的值都会+1。若key不存在,则先建立一个0,然后+1,返回 1。如果值不是整数则报错。该操作是原子操作。

#示例

127.0.0.1:6379>setname'辰东'

OK

127.0.0.1:6379>setid33

OK

127.0.0.1:6379>getname

辰东

127.0.0.1:6379> mget name id

辰东

33

127.0.0.1:6379> mset name1'dpc'id111

OK

127.0.0.1:6379> mget name1 id1

dpc

11

127.0.0.1:6379>keys*

id

name1

id1

name

127.0.0.1:6379> del name1

1

127.0.0.1:6379> del id1

1

127.0.0.1:6379> append name'大神'

12

127.0.0.1:6379>getname

辰东大神

127.0.0.1:6379> decr id

21

127.0.0.1:6379> decrby id3

18

3.3 list类型

列表类型存储了一个有序的字符串列表。常用的操作是向两端插入新的元素。时间复杂度为O(1),结构为一个链表,记录头和尾的地址。Redis数据类型的列表类型一个重大的作用那就是队列。新来的请求插入到尾部,新处理过的从头部删除。另外,比如微博的新鲜事,比如日志。列表类型就是一个下标从 0 开始的数组。由于是链表存储,那么越靠近头和尾的元素操作越快,越靠近中间则越慢。

#常用操作

lpush list v1 v2        #向左侧插入,返回增加后的列表长度

rpush list v1 v2      #向右侧插入,返回增加后的列表长度

lpop list              #从左侧弹出,返回被弹出元素值

rpop list              #从右侧弹出,返回被弹出元素值

llen list              #列出元素个数

lrangestartend        #获取从start到end的元素列表(双闭合)

ltrim liststartend  #截取片段

lindex list index      #获取指定元素

lset list index value  #设置指定元素的值

linsert list before newvalue value1 #在某个值value1之前面追加值newvalue

#示例

127.0.0.1:6379> lpush name'dpc''dpc1''dpc2'

3

127.0.0.1:6379> llen name

3

127.0.0.1:6379> lrange name0-1

dpc2

dpc1

dpc

127.0.0.1:6379> rpush name dpc3

4

3.4 hash哈希数据结构

Redis是以字典(关联数组)的形式存储的,一个 key 对应一个 value。在字符串类型中,value 只能是一个字符串。那么在散列类型,也叫哈希类型中,value 对应的也是一个字典(关联数组)。那么就可以理解,Redis 的哈希类型/散列类型中,key 对应的 value 是一个二维数组。但是字段的值只可以是字符串。也就是说只能是二维数组,不能有更多的维度。

#结构

key:键 field:域/字段 value:值

键 {

    域1:值1

    域2:值2

    域3:值3

}

#操作

hset key field value        #赋值,hset 键 域/字段 值

hsetnx key field value      #当key不存在时赋值

hget key field            #取值

hmget key f1 v1 f2 v2      #同一个key多个字段赋值

hmget key field1 field2    #同一个key多个字段取值

hgetall key                #获取key的所有字段和所有值

hkeys key                  #获取key的所有字段

hvals key                  #获取key的所有值

hdel key f1 f2              #删除key的一个或各个字段

hlen key                    #获取key的字段数量

hexists key field          #判断字段是否存在,存在返回1,否则返回0

#示例

hset news title"this is first tiltle"

hset news content"this is the content"

hlen news

3.5 set集合类型

redis的集合,是一种无序且元素唯一的集合,集合中的元素没有先后顺序。

#常用操作

sadd key value      #增加

srem key value      #删除remove

smembers key        #返回集合中所有的成员

sismember key      #判断某个元素是否存在

sdiff key1 key2    #对多个集合进行差集运算

sinter key1 key2    #对多个集合进行交集运算

sunion key1 key2    #对多个集合进行并集运算

4.redis的配置详解

redis 安装成功以后,window下的配置文件保存在软件 安装目录下,如果是mac或者linux,则默认安装/etc/redis/redis.conf

linux下的apt命令安装:

sudo apt install redis-server

redis的核心配置选项

绑定ip:如果需要远程访问,可将此⾏注释,或绑定⼀个真实ip

bind 127.0.0.1

端⼝,默认为6379

port 6379

是否以守护进程运⾏[这里的配置主要是linux和mac下面需要配置的]

如果以守护进程运⾏,则不会在命令⾏阻塞,类似于服务

如果以⾮守护进程运⾏,则当前终端被阻塞

设置为yes表示守护进程,设置为no表示⾮守护进程

推荐设置为yes

daemonize yes

数据⽂件

dbfilename dump.rdb

数据⽂件存储路径

dir .

⽇志⽂件

logfile "C:/tool/redis/redis-server.log"

数据库,默认有16个

database 16

主从复制,类似于双机备份。

slaveof

5.Redis的使用

Redis 是一个高性能的key-value数据格式的内存缓存,NoSQL数据库。

NOSQL:not only sql,泛指非关系型数据库。

关系型数据库(mysql, oracle, sql server, sqlite):

1. 数据存放在表中,表之间有关系。

2. 通用的SQL操作语言。

3. 大部分支持事务。

非关系型数据库(redis,hadoop,mangoDB):

1. 没有数据表的概念,不同的nosql数据库存放数据位置不同。

2. nosql数据库没有通用的操作语言。

3. 基本不支持事务,redis支持简单事务。

redis:内存型(数据存放在内存中)的非关系型(nosql)key-value(键值存储)数据库,支持数据的持久化(注: 数据持久化时将数据存放到文件中,每次启动redis之后会先将文件中数据加载到内存),经常用来做缓存(用来缓存一些经常用到的数据,提高读写速度)。

redis是一款基于CS架构的数据库,所以redis有客户端,也有服务端。

其中,客户端可以使用python等编程语言,也可以终端命令行工具

redis客户端连接服务器:

redis-cli -h `redis服务器ip` -p `redis服务器port`

6.键操作

查找键,参数⽀持正则表达式

keys pattern

例1:查看所有键

keys *

例2:查看名称中包含a的键

keys a*

判断键是否存在,如果存在返回1,不存在返回0

exists key1

例3:判断键a1是否存在

exists a1

查看键对应的value的类型

type key

例4:查看键a1的值类型,为redis⽀持的五种类型中的⼀种

type a1

删除键及对应的值

del key1 key2 ...

例5:删除键a2、a3

del a2 a3

查看有效时间,以秒为单位,key的剩余过期时间(time to live)

ttl key

--如果key不存在或者已过期,返回 -2

--如果key存在并且没有设置过期时间(永久有效),返回 -1 。

例7:查看键bb的有效时间

ttl bb

清空当前数据库中所有键值对

flushall

7.string

如果设置的键不存在则为添加,如果设置的键已经存在则修改

设置键值

set key value

例1:设置键为name值为xiaoming的数据

set name xiaoming

设置键值及过期时间,以秒为单位

setex key seconds value

例2:设置键为aa值为aa过期时间为3秒的数据

setex name 20 xiaoming

关于设置保存数据的有效期

# setex 添加保存数据到redis,同时设置有效期

格式:

    setexkeytimevalue

# expire 给已有的数据重新设置有效期[注意,如果数据不存在或者已经早已过期,是设置无效的,而且这是重新指定有效期,不是追加有效期!!!]

格式:

    expirekeytime

设置多个键值

mset key1 value1 key2 value2 ...

例3:设置键为a1值为python、键为a2值为java、键为a3值为c

mset a1 python a2 java a3 c

追加值[字符串拼接]

append key value

例4:向键为name,值为li,追加值xiaolong

set name li

append name xiaolong

get name

"lixiaolong"

获取:根据键获取值,如果不存在此键则返回nil

get key

例5:获取键name的值

get name

根据多个键获取多个值

mget key1 key2 ...

例6:获取键a1、a2、a3的值

mget a1 a2 a3

自增自减

对一个数值,进行+1 或者-1操作

set num 10

incr num    # 11

decr  num # 10

8.hash

结构:

键key:{

域field:值value,

   域field:值value,

   域field:值value,

}

设置单个属性

hset key field value

例1:设置键 user的属性name为xiaohong

hset user name xiaohong

设置多个属性

hmset key field1 value1 field2 value2 ...

例2:设置键u2的属性name为xiaohong、属性age为11

hmset u2 name xiaohongage 11

获取指定键所有的属性

hkeys key

例3:获取键u2的所有属性

hkeys u2

获取⼀个属性的值

hget key field

例4:获取键u2属性name的值

hget u2 name

获取多个属性的值

hmget key field1 field2 ...

例5:获取键u2属性name、age的值

hmget u2 name age

获取所有属性的值

hvals key

例6:获取键u2所有属性的值

hvals u2

删除属性,属性对应的值会被⼀起删除

hdel key field1 field2 ...

例7:删除键u2的属性age

hdel u2 age

9.list

列表的元素类型为string

按照插⼊顺序排序

在左侧插⼊数据 (注意先插进去的是value1,value1在value2右侧)

lpush key value1 value2 ...

例1:从键为a1的列表左侧加⼊数据a 、 b 、c

lpush a1 a b c

在右侧插⼊数据

rpush key value1 value2 ...

例2:从键为a1的列表右侧加⼊数据0、1

rpush a1 0 1

在指定元素的前或后插⼊新元素

linsert key before或after 现有元素 新元素

例3:在键为a1的列表中元素b前加⼊3

linsert a1 before b 3

设置指定索引位置的元素值

索引从左侧开始,第⼀个元素为0

索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素

lset key index value

例5:修改键为a1的列表中下标为1的元素值为z

lset a 1 z

删除指定元素

将列表中前count次出现的值为value的元素移除

count > 0: 从头往尾移除

count < 0: 从尾往头移除

count = 0: 移除所有

lrem key count value

例6.1:向列表a2中加⼊元素a、b、a、b、a、b

lpush a2 a b a b a b

例6.2:从a2列表右侧开始删除2个b

lrem a2 -2 b

例6.3:查看列表a2的所有元素

lrange a2 0 -1

10.set

添加元素

sadd key member1 member2 ...

例1:向键a3的集合中添加元素zhangsan、lisi、wangwu

sadd a3 zhangsan sili wangwu

返回所有的元素

smembers key

例2:获取键a3的集合中所有元素

smembers a3

删除指定元素

srem key value

例3:删除键a3的集合中元素wangwu

srem a3 wangwu

11.redis内容扩展

中文官网: http://www.redis.cn/

英文官网:https://redis.io

参考命令:http://doc.redisfans.com/

针对redis中的内容扩展

针对各种数据类型它们的特性,使用场景如下:

字符串string: 用于保存一些项目中的普通数据或者具有时效性的数据,只要键值对的都可以保存,例如,保存session,定时记录状态,短信验证码,优惠券,积分,会员的时间长度

哈希hash:用于保存项目中的一些字典数据,但是不能保存多维的字典,例如,商城的购物车,访问历史记录,权限数据

列表list:用于保存项目中的列表数据,但是也不能保存多维的列表,例如,队列,秒杀,医院的挂号,派单系统,任务队列

无序集合set:用于保存项目中的一些不需要在意顺序的数据,可以用于去重,例如,过滤投票系统的候选人,投票记录

有序集合zset:用于保存项目中一些不能重复,但是需要进行排序的数据,例如,排行榜,数据分析表

12.windows下redis下载和安装

window系统的redis是微软团队根据官方的linux版本高仿的

官方原版: https://redis.io/

中文官网:http://www.redis.cn

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


使用以下命令启动redis服务端

redis-server C:/tool/redis/redis.windows.conf

关闭上面这个cmd窗口就关闭redis服务器服务了。

redis作为windows服务启动方式

redis-server --service-install redis.windows.conf

启动服务:redis-server --service-start停止服务:redis-server --service-stop

启动内置客户端连接redis服务:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • redis是一个以key-value存储的非关系型数据库。有五种数据类型,string、hashes、list、s...
    林ze宏阅读 984评论 0 0
  • 1 Redis介绍1.1 什么是NoSql为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方...
    克鲁德李阅读 5,265评论 0 36
  • 一、Redis基础 1.概述 Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的W...
    郑元吉阅读 293评论 0 0
  • 一、Redis基础概述Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用...
    土卡拉阅读 233评论 0 0
  • 一、Redis基础 概述Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应...
    陈small末阅读 585评论 0 0