《redis学习》之入门

redis安装(Linux版)

[root@server-1 home]# tar zxvf redis-4.0.14.tar.gz 
[root@server-1 home]# cd redis-4.0.14
[root@server-1 redis-4.0.14]# make
[root@server-1 redis-4.0.14]# cd src
[root@server-1 src]# make install PREFIX=/usr/local/redis

执行完上面的命令后redis安装完成,但安装完后只有一个bin,配置文件需要从redis4.0.14中复制过来

[root@server-1 redis-4.0.14]# cd /usr/local/redis/
[root@server-1 redis]# ls
bin
[root@server-1 redis]# mkdir /usr/local/redis/etc #先创建一个放redis.conf配置文件的目录
#将配置文件复制到编译的目录
[root@server-1 redis-4.0.14]# cp redis.conf sentinel.conf /usr/local/redis/etc/
[root@server-1 redis-4.0.14]# cd /usr/local/redis/etc/
[root@server-1 etc]# ls
redis.conf  sentinel.conf

配置redis为后台启动和输出日志和工作目录(工作目录是后面数据备份放的地方)
编辑配置文件vim /usr/local/redis/etc/redis.conf 将 daemonize no 改成 daemonize yes
编辑配置文件vim /usr/local/redis/etc/redis.conf 将 logfile 改成 /usr/local/redis/logs/redis.log
编辑配置文件vim /usr/local/redis/etc/redis.conf 将 dir 改成 /usr/local/redis/work
编辑配置文件vim /usr/local/redis/etc/redis.conf 将 bind的值 改成 0.0.0.0 (默认127.0.0.1只能本机连接,不改会导致其他机器连接不上)
详细的配置命令详解:https://blog.csdn.net/wngua/article/details/70158818
启动redis

[root@server-1 bin]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 
5690:C 31 Mar 04:32:34.288 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5690:C 31 Mar 04:32:34.288 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=5690, just started
5690:C 31 Mar 04:32:34.288 # Configuration loaded
[root@server-1 bin]# ps -ef|grep redis
root       5691      1  0 04:32 ?        00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:6379                 
root       5696   2345  0 04:32 pts/0    00:00:00 grep redis

进入客户端操作

[root@server-1 bin]# /usr/local/redis/bin/redis-cli [-p 端口号 -h ip地址 -a 密码(如果有设置requirepass)]

redis可执行文件列表说明

image.png

redis的常用通用命令
image.png

keys命令在线上最好禁止使用,因为redis是单线程,keys会查出大量的数据导致redis卡顿

127.0.0.1:6382> set hello word
OK
127.0.0.1:6382> set php good
OK
127.0.0.1:6382> set java best
OK
127.0.0.1:6382> keys *
1) "java"
2) "hello"
3) "php"
127.0.0.1:6382> dbsize
(integer) 3
127.0.0.1:6382> exists php
(integer) 1
127.0.0.1:6382> del php java
(integer) 2
127.0.0.1:6382> keys *
1) "hello"
127.0.0.1:6382> expire hello 20
(integer) 1
127.0.0.1:6382> ttl hello
(integer) 16
127.0.0.1:6382> ttl hello
(integer) 12
127.0.0.1:6382> persist hello
(integer) 1
127.0.0.1:6382> ttl hello
(integer) -1
127.0.0.1:6382> type hello

redis的数据类型和使用

image.png
string类型
image.png
127.0.0.1:6382> set hello "world"
OK
127.0.0.1:6382> get hell
(nil)
127.0.0.1:6382> get hello
"world"
127.0.0.1:6382> del hello
(integer) 1
127.0.0.1:6382> get hello
(nil)
127.0.0.1:6382> get counter
(nil)
127.0.0.1:6382> incr counter
(integer) 1
127.0.0.1:6382> get counter
"1"
127.0.0.1:6382> incrby counter 99
(integer) 100
127.0.0.1:6382> get counter 
"100"
127.0.0.1:6382> decr counter
(integer) 99
127.0.0.1:6382> get counter
"99"
127.0.0.1:6382> decrby counter 100
(integer) -1
127.0.0.1:6382> get counter
"-1"
127.0.0.1:6382> exists php
(integer) 0
127.0.0.1:6382> set php good
OK
127.0.0.1:6382> setnx php bad
(integer) 0
127.0.0.1:6382> set php best xx
OK
127.0.0.1:6382> get php
"best"
127.0.0.1:6382> exists java
(integer) 0
127.0.0.1:6382> setnx java best
(integer) 1
127.0.0.1:6382> set java easy xx
OK
127.0.0.1:6382> get java
"easy"
127.0.0.1:6382> set hello world
OK
127.0.0.1:6382> getset hello php
"world"
127.0.0.1:6382> get hello
"php"
127.0.0.1:6382> append hell ",php"
(integer) 4
127.0.0.1:6382> get hello
"php"
127.0.0.1:6382> append hello ",php"
(integer) 7
127.0.0.1:6382> get hello
"php,php"
127.0.0.1:6382> strlen hello
(integer) 7
127.0.0.1:6382> set hello "吴军旗"
OK
127.0.0.1:6382> strlen hello
(integer) 9
hash
image.png

image.png
127.0.0.1:6382> hset user1 age 26
(integer) 1
127.0.0.1:6382> hset user1 name wujunqi
(integer) 1
127.0.0.1:6382> hgetall user1
1) "age"
2) "26"
3) "name"
4) "wujunqi"
127.0.0.1:6382> hdel user1 age
(integer) 1
127.0.0.1:6382> hgetall user1
1) "name"
2) "wujunqi"
127.0.0.1:6382> hget user1 name
"wujunqi"
127.0.0.1:6382> hexists user1 name
(integer) 1
127.0.0.1:6382> hlen user1
(integer) 1
127.0.0.1:6382> hmset user2 name xiaofang age 26
OK
127.0.0.1:6382> hmget user2 name age
1) "xiaofang"
2) "26"
127.0.0.1:6382> hgetall user2
1) "name"
2) "xiaofang"
3) "age"
4) "26"
127.0.0.1:6382> hvals user2
1) "xiaofang"
2) "26"
127.0.0.1:6382> hkeys user2
1) "name"
2) "age"
127.0.0.1:6382> hincrby user age 2
(integer) 2
127.0.0.1:6382> hgetall user2
1) "name"
2) "xiaofang"
3) "age"
4) "26"
127.0.0.1:6382> hincrby user2 age 2
(integer) 28
127.0.0.1:6382> hgetall user2
1) "name"
2) "xiaofang"
3) "age"
4) "28"
127.0.0.1:6382> hincrbyfloat user2 age 2.0
"30"
127.0.0.1:6382> hincrbyfloat user2 age 2.5
"32.5"
127.0.0.1:6382> hgetall user2
1) "name"
2) "xiaofang"
3) "age"
4) "32.5"
list类型
image.png

用list做队列【右边进左边出】

127.0.0.1:6379> rpush xlist a b c d
(integer) 4
127.0.0.1:6379> lrange xlist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> lpop xlist
"a"
127.0.0.1:6379> lpop xlist
"b"
127.0.0.1:6379> lpop xlist
"c"
127.0.0.1:6379> lpop xlist
"d"

栈【右边进右边出】

127.0.0.1:6379> rpush ylist a b c d
(integer) 4
127.0.0.1:6379> lrange ylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> rpop ylist
"d"
127.0.0.1:6379> rpop ylist
"c"
127.0.0.1:6379> rpop ylist
"b"
127.0.0.1:6379> rpop ylist
"a"
> rpush books python java golang
(integer) 3
#index=-1表示倒数第一个元素,同样index=-2表示倒数第二个元素
> lindex books 1  # O(n) 慎用 lindex表示获取第n个数据
"java"
> lrange books 0 -1  # 获取所有元素,O(n) 慎用
1) "python"
2) "java"
3) "golang"
> ltrim books 1 -1 # O(n) 慎用
OK
> lrange books 0 -1
1) "java"
2) "golang"
> ltrim books 1 0 # 这其实是清空了整个列表,因为区间范围长度为负
OK
> llen books
(integer) 0
set类型

Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据


image.png

image.png
127.0.0.1:6379> sadd set1 a b c d ##添加数据到set
(integer) 4
127.0.0.1:6379> sadd set1 a ##a已经存在,再次添加返回0
(integer) 0
127.0.0.1:6379> srem set1 a #删除a
(integer) 1
127.0.0.1:6379> smembers set1 #输出所有的象
1) "d"
2) "c"
3) "b"
127.0.0.1:6379> scard set1 #计算象限的数量
(integer) 3
127.0.0.1:6379> sismember set1 d #判断d是否存在
(integer) 1
zset类型

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复


image.png

image.png

redis单线程但是快的原因

单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行


image.png
  1. 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速
  2. 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的
  3. 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消
  4. 使用多路I/O复用模型,非阻塞IO
  5. 用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求
多路 I/O 复用模型

多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。
这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量
虽然说redis是单线程的,但是他的持久化机制例如rdb和aof需要开启子线程

参考

https://juejin.im/post/5a912b3f5188257a5c608729

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

推荐阅读更多精彩内容

  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 3,967评论 2 27
  • [TOC] redis是什么 官方解释:redis 是一个开源的,内存中的K-V数据结构存储系统,它可以用作数据库...
    0x70e8阅读 463评论 0 1
  • 《Redis 入门指南》(第二版) 第一章 Redis 是什么 Redis (REmote Dictionary ...
    EdenPP阅读 67,296评论 3 10
  • 因为人多,资源少,所以人与人之间不好相处,为了利益互相勾心斗角,永无安宁之日。 很多时候自己还在努力,是为了有一天...
    博鲲阅读 196评论 0 1
  • 心有千千绪,却无法落笔成文,浅陋到如此,还有什么颜面敢不读书,敢不勤奋?! 一言以为知,一言以不知。慎思,慎言!
    佳佳ly阅读 475评论 0 1