设为首页 收藏本站
查看: 1054|回复: 0

[经验分享] redis安装及redis数据类型

[复制链接]

尚未签到

发表于 2018-11-5 10:59:24 | 显示全部楼层 |阅读模式
  Redis介绍:
  一、介绍
  在过去的几年中,NoSQL数据库一度成为高并发、海量数据存储解决方案的代名词,与之相应的产品也呈现出雨后春笋般的生机。然而在众多产品中能够脱颖而出的却屈指可数,如Redis、MongoDB、BerkeleyDB和CouchDB等。由于每种产品所拥有的特征不同,因此它们的应用场景也存在着一定的差异,下面仅给出简单的说明:
  1). BerkeleyDB是一种极为流行的开源嵌入式数据库,在更多情况下可用于存储引擎,比如BerkeleyDB在被Oracle收购之前曾作为MySQL的存储引擎,由此可以预见,该产品拥有极好的并发伸缩性,支持事务及嵌套事务,海量数据存储等重要特征,在用于存储实时数据方面具有极高的可用价值。然而需要指出的是,该产品的Licence为GPL,这就意味着它并不是在所有情况下都是免费使用的。
  2). 对MongoDB的定义为Oriented-Document数据库服务器,和BerkeleyDB不同的是该数据库可以像其他关系型数据库服务器那样独立的运行并提供相关的数据服务。从该产品的官方文档中我们可以获悉,MongoDB主要适用于高并发的论坛或博客网站,这些网站具有的主要特征是并发访问量高、多读少写、数据量大、逻辑关系简单,以及文档数据作为主要数据源等。和BerkeleyDB一样,该产品的License同为GPL。
  3). Redis,典型的NoSQL数据库服务器,和BerkeleyDB相比,它可以作为服务程序独立运行于自己的服务器主机。在很多时候,人们只是将Redis视为Key/Value数据库服务器,然而事实并非如此,在目前的版本中,Redis除了Key/Value之外还支持List、Hash、Set和Ordered Set等数据结构,因此它的用途也更为宽泛。对于此种误解,Redis官网也进行了相应的澄清。和以上两种产品不同的是,Redis的License是Apache License,就目前而言,它是完全免费。
  4). memcached,数据缓存服务器。为什么在这里要给出该产品的解释呢?很简单,因为笔者认为它在使用方式上和Redis最为相似。毕竟这是一篇关于Redis的技术系列博客,有鉴于此,我们将简要的对比一下这两个产品。首先说一下它们之间的最大区别,memcached只是提供了数据缓存服务,一旦服务器宕机,之前在内存中缓存的数据也将全部消失,因此可以看出memcached没有提供任何形式的数据持久化功能,而Redis则提供了这样的功能。再有就是Redis提供了更为丰富的数据存储结构,如Hash和Set。至于它们的相同点,主要有两个,一是完全免费,再有就是它们的提供的命令形式极为接近。
  二、redis和memcache对比
DSC0000.png

  持久化:以电商举例,session用memcache来做的,购物车用redis来做的,当你退出的时候会提示你购物车里面的物品会在你退出后继续保持。相对来说memcache存储更单一化!
  主从复制:redis的主从复制类似mysql的主从复制但是原理是不同的!
  虚拟内存:说白了就是把内存里一些不用的东西放在硬盘上,最好不要用,降低效率,现在内存比较便宜。
  
  Redis安装&基本操作:
  Redis安装
1、检查配置环境  
检查gcc是否安装,如果没有安装:yum -y install gcc
  

  
2、下载安装redis
  
# wget http://download.redis.io/releases/redis-3.0.7.tar.gz
  
# tar xf redis-3.0.7.tar.gz -C /usr/local
  
# cd /usr/local
  
# ln -sv redis-3.0.7/ redis
  
`redis' -> `redis-3.0.7/'
  
# cd redis
  
# make && make install
  
# 安装中可能遇到的问题:
  
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
  
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
  

  
Allocator
  
-----------------------------------------------------------------------
  
Selecting a non-default memory allocator when building Redis is done by setting
  
the `MALLOC` environment variable. Redis is compiled and linked against libc
  
malloc by default, with the exception of jemalloc being the default on Linux
  
systems. This default was picked because jemalloc has proven to have fewer
  
fragmentation problems than libc malloc.
  
To force compiling against libc malloc, use:
  
% make MALLOC=libc
  
To compile against jemalloc on Mac OS X systems, use:
  
% make MALLOC=jemalloc
  

  
allocator(分配算符),如果有MALLOC这个环境变量,会有用这个环境变量的 去建立Redis。
  
而且libc 并不是默认的分配器,默认的是jemalloc!
  
因为jemalloc被证明有更少的fragmentation problems比libc。
  

  
但是如果你又没有jemalloc 而只有 libc 当然 make 出错。 所以加这么一个参数。
  
make MALLOC=libc
  
-----------------------------------------------------------------------
  

  
3、配置redis
  
# cp utils/redis_init_script /etc/init.d/redis  #管理脚本
  
# chmod +x /etc/init.d/redis
  
# mkdir /etc/redis
  
# cp redis.conf /etc/redis/6379.conf
  

  
4、修改redis启动方式
  
默认redis启动是启动在前台的,我把他修改成在后台启动
  
# vim /etc/redis/6379.conf
  
daemonize no改为daemonize yes
  

  
5、redis加入系统服务并设置为开机启动
  
首先修改redis启动脚本:
  
# vim /etc/init.d/redis
  
#chkconfig: 35 95 95 在第三行加上即可
  

  
#添加系统服务: chkconfig --add redis
  
#设置开机启动: chkconfig redis on
  
#检查服务状态: chkconfig --list redis
  
redis           0:off   1:off   2:on    3:on    4:on    5:on    6:off
  

  
6、指定日志文件存放位置&PID文件&数据库文件存放位置
  
# vim /etc/redis/6379.conf
  
logfile "/var/log/redis.log"  #指定日志文件如果不指定就会在控制台输出
  
pidfile /var/run/redis_6379.pid
  
dir /u01/redis  #这个是指默认的持久化配置文件放在哪里
  

  
#pidfile如果不修改使用默认的话就会报错:
  
原因是在/etc/init.d/redis里指定的默认PID是:PIDFILE=/var/run/redis_${REDISPORT}.pid
  
但是默认配置文件:/etc/redis/6379.conf(咱们自己从解压包里复制的默认是:pidfile /var/run/redis.pid)
  二、Redis基本操作
  SET 设置Key
  GET 判断Key的值
  EXISTS 判断Key是否存在
  KEYS * 显示所有的Key
  DEL 删除指定Key
  TYPE 获取Key类型
  
  注:Redis是不区分大小写的,命令最好使用大写这样能区分命令还是参数!
1、set的例子:  
# redis-cli
  
127.0.0.1:6379> SET hello world
  
OK
  
127.0.0.1:6379> GET hello
  
"world"
  

  
2、设置多个key value 然后使用keys * 去查看所有
  
127.0.0.1:6379> SET hello1 zhangsan
  
OK
  
127.0.0.1:6379> SET hello2 lishi
  
OK
  

  
1) "hello2"
  
2) "hello"
  
3) "hello1"
  

  
KEY匹配方式:
  
?匹配单个
  
*匹配所以
  

  
3、判断key是否存在
  
判断key是否存在使用:EXISTS 他返回的整型:0不存在,1存在
  
127.0.0.1:6379> EXISTS hello
  
(integer) 1
  
127.0.0.1:6379> EXISTS hehe
  
(integer) 0
  
127.0.0.1:6379> EXISTS zhangsan
  
(integer) 0
  
127.0.0.1:6379> EXISTS hello1
  
(integer) 1
  

  
4、删除KEY
  
127.0.0.1:6379> DEL hello
  
(integer) 1
  
127.0.0.1:6379> DEL hello1 hello2
  
(integer) 2
  
127.0.0.1:6379> KEYS *
  
(empty list or set)
  

  
5、查看类型TYPE
  
只要用set类型就是字符串。查看类型命令用TYPE
  
127.0.0.1:6379> SET hello world
  
OK
  
127.0.0.1:6379> TYPE hello
  
string
  

  
6、Keyspace
  
redis是支持多个实例的,默认最多16个,可以修改配置文件来支持更多!
  
使用INFO命令查看
  
127.0.0.1:6379> INFO
  

  
db0:keys=1,expires=0,avg_ttl=0
  
#db0:这个可以理解为命名空间。最多支持16个,使用SELECT去切换
  

  
127.0.0.1:6379> SELECT 1
  
OK
  
127.0.0.1:6379[1]> SET db1 hehe  #添加一个key-value
  
OK
  
127.0.0.1:6379[1]> INFO  #使用INFO查看
  

  
db0:keys=1,expires=0,avg_ttl=0
  
db1:keys=1,expires=0,avg_ttl=0
  Redis数据类型:
  他用不同的命令来区分你要操作什么数据类型
  类型不能嵌套,不能混!但是有个王炸:set能把所有的类型都改为字符串类型!
  1、字符串类型:
SET  
GET
  
DEL
  
APPEND 在值的后面追加
  
SET能重新设置但是要追加的话使用APPEND最好
  
127.0.0.1:6379[1]> SET hehe hello
  
OK
  
127.0.0.1:6379[1]> GET hehe
  
"hello"
  
127.0.0.1:6379[1]> APPEND hehe ,world
  
(integer) 11
  
127.0.0.1:6379[1]> GET hehe
  
"hello,world"
  

  
可以同时设置多个值和查询值用MSET和MGET
  
127.0.0.1:6379[1]> MSET key1 v1 key2 v2 key3 v3
  
OK
  
127.0.0.1:6379[1]> MGET key1 key2 key3
  
1) "v1"
  
2) "v2"
  
3) "v3"
  

  
获取字符串长度
  
127.0.0.1:6379[1]> STRLEN hehe
  
(integer) 11
  
如果字符串是中文的他会按照UTF-8格式的来输出1个字等3个字符串来算的
  
127.0.0.1:6379[1]> SET key "呵呵"
  
OK
  
127.0.0.1:6379[1]> GET key
  
"\xe5\x91\xb5\xe5\x91\xb5"
  
127.0.0.1:6379[1]> STRLEN key
  
(integer) 6
  2、自增类型
比如说投票点下+1 ,如果说用set每点一次修改set下那就不太现实。所有redis有个自增类型:INCR  
127.0.0.1:6379[1]> INCR num
  
(integer) 1    #默认如果没有这个值的话,INCR就会自动创建一个值默认为零,当你没执行一次他就会+1
  
127.0.0.1:6379[1]> INCR num
  
(integer) 2
  
127.0.0.1:6379[1]> INCR num
  
(integer) 3
  
127.0.0.1:6379[1]> INCR num
  
(integer) 4
  
127.0.0.1:6379[1]> INCR num
  

  
如果想加多个:INCRBY
  
127.0.0.1:6379[1]> INCRBY num 10
  
(integer) 15
  
127.0.0.1:6379[1]> INCRBY num 10
  
(integer) 25
  
127.0.0.1:6379[1]> INCRBY num 10
  
(integer) 35
  

  
减呢? DECR
  
127.0.0.1:6379[1]> DECR num
  
(integer) 34
  
127.0.0.1:6379[1]> DECR num
  
(integer) 33
  

  
如果要减多个:NECRBY
  
127.0.0.1:6379[1]> DECRBY num 5
  
(integer) 28
  
127.0.0.1:6379[1]> DECRBY num 5
  
(integer) 23
  
127.0.0.1:6379[1]> DECRBY num 5
  
(integer) 18
  

  
想支持小数点:
  
INCRBYFLOAT key 0.1
  
127.0.0.1:6379[1]> INCRBYFLOAT nums 0.1
  
"0.1"
  
127.0.0.1:6379[1]> INCRBYFLOAT nums 0.1
  
"0.2"
  
127.0.0.1:6379[1]> INCRBYFLOAT nums 0.1
  
"0.3"
  
127.0.0.1:6379[1]> INCRBYFLOAT nums 0.1
  
"0.4"
  3、散列类型(hash)
和数据库存的表似的,表不是有的字段吧,可以给每个字段设置个值  
HSET Key field value
  
HGET Key field
  
HMSET Key field value [field value....]
  
HMGET Key field [field ...]
  
HGETALL Key
  
HDEL
  

  
127.0.0.1:6379[1]> HSET shouji name iphone
  
(integer) 1
  
127.0.0.1:6379[1]> HSET shouji co red
  
(integer) 1
  
127.0.0.1:6379[1]> HSET shouji price 8888
  
(integer) 1
  
127.0.0.1:6379[1]> HGET shouji name
  
"iphone"
  
127.0.0.1:6379[1]> HGET shouji co
  
"red"
  
127.0.0.1:6379[1]> HGET shouji price
  
"8888"
  
127.0.0.1:6379[1]> HGETALL shouji
  
1) "name"
  
2) "iphone"
  
3) "co"
  
4) "red"
  
5) "price"
  
6) "8888"
  

  
其实现在看着不是好看的但是他通过一些API调用到网页上,通过排版取出来的值就好看了
  
127.0.0.1:6379[1]> HMSET diannao name dell co black price 5000
  
OK
  
127.0.0.1:6379[1]> HMGET diannao name co price
  
1) "dell"
  
2) "black"
  
3) "5000"
  4、列表类型
列表类型:他是存储一个有序的字符串列表   这个“有序”是什么时候进来的!  

  

  
列表你向左边添加和右边添加他的时间复杂度是一样的!O1(时间复杂度)
  
可以理解为:我这个速度不随着数量的增加而增加!比如1000行和1万行他的时间开销是一样的!  大学数据结构里学的
  

  
时间复杂度:
  
同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和
  
改进算法。计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。
  

  
但是他有个缺点,比如说里面有1万个key你想找到第98个这就费老劲了他从1开始数数到98
  
优点,你读前100个,卡直接读头部就非常快了
  

  

  
命令:
  
LPUSH key value [value ...]
  
RPUSH key value [value ...]
  
               LPOP key
  
               RPOP key
  
     LRANGE key start stop
  
     LREM key count value
  

  
4.1、从左边添加key
  
127.0.0.1:6379[1]> LPUSH sum 0
  
(integer) 1
  
127.0.0.1:6379[1]> LPUSH sum 1
  
(integer) 2
  
127.0.0.1:6379[1]> LPUSH sum 2
  
(integer) 3
  
#现在是从左边加 2 1 0
  

  
#从右边开始加
  
127.0.0.1:6379[1]> RPUSH sum 3
  
(integer) 4
  
127.0.0.1:6379[1]> RPUSH sum 5
  
(integer) 5
  
#现在应该是 2 1 0 3 5
  

  
如果想获取长度就使用LNE吗!获取列表类型长度就是:LLEN
  
127.0.0.1:6379[1]> LLEN sum
  
(integer) 5
  

  
4.2、从左边拿key
  
从列表类型里拿出这个Key来(拿出来就没有了),从左边拿左边第一个
  
127.0.0.1:6379[1]> LPOP sum
  
"2"
  

  
左边第一个是2那么拿出来之后这个key就变成   1 0 3 5
  

  
从右边拿Key,从右边拿右边第一个
  
127.0.0.1:6379[1]> RPOP sum
  
"5"   (5被拿出来了)
  

  
现在在看下这个key的长度
  
127.0.0.1:6379[1]> LLEN sum
  
(integer) 3
  

  
4.3、获取列表的某一个范围:
  
现在是这个值 1 0 3
  

  
127.0.0.1:6379[1]> LRANGE sum 0 1   #取0 - 1 的值
  
1) "1"
  
2) "0"
  

  
###这个列表和python中列表中差不多,0 -1 相当于列表中的下标。
  

  
127.0.0.1:6379[1]> LPUSH sum 2
  
(integer) 4
  
127.0.0.1:6379[1]> RPUSH sum 4
  
(integer) 5
  

  

  
127.0.0.1:6379[1]> LRANGE sum 0 -1  #这里的(-1)表示左边第一个
  
1) "2"
  
2) "1"
  
3) "0"
  
4) "3"
  
5) "4"
  

  
4.4、获取指定元素的值
  
获取右边的第一个值:
  
127.0.0.1:6379[1]> LINDEX sum -1
  
"4"
  
获取右边的第二个值:
  
127.0.0.1:6379[1]> LINDEX sum -2
  
"3"
  
127.0.0.1:6379[1]> LINDEX sum -3
  
"0"
  

  
从左边获取值
  
127.0.0.1:6379[1]> LINDEX sum 0
  
"2"
  
127.0.0.1:6379[1]> LINDEX sum 1
  
"1"
  

  
4.5、只保留指定数据
  
只保留0到2的数据
  
127.0.0.1:6379[1]> LTRIM sum 0 2
  
OK
  
127.0.0.1:6379[1]> LRANGE sum 0 -1
  
1) "2"
  
2) "1"
  
3) "0"
  

  
这个有什么用呢:
  
写日志的时候,我这个缓冲区,只保留最近100条日志!
  
比如:
  
127.0.0.1:6379[1]> LPUSH logs newloghehe
  
(integer) 1
  
127.0.0.1:6379[1]> LTRIM sum 0 99
  
OK
  

  
这样的话我的列表永远只有100条,我只看最近100条的日志!!
  5、集合类型
交集∩、并集∪、合集、等 0 0 !  

  
集合的元素是没有类型的!
  
用到集合类型的应用有:(新浪微博分享了很多的redis应用)
  
比如:关注微博,比如咱俩是否共同关注了某一个人等。
  

  
5.1、添加集合
  
127.0.0.1:6379[1]> SADD jihe1 a b c
  
(integer) 3
  
127.0.0.1:6379[1]> SADD jihe2 b c d
  
(integer) 3
  

  
5.2、查看集合内容
  
127.0.0.1:6379[1]> SMEMBERS jihe1
  
1) "c"
  
2) "b"
  
3) "a"
  

  
5.3、判断集合元素是否存在
  
127.0.0.1:6379[1]> SISMEMBER jihe1 d
  
(integer) 0  #返回0说明不存在
  
127.0.0.1:6379[1]> SISMEMBER jihe1 b
  
(integer) 1  #返回1说明存在
  

  
5.4、集合间运算
  
支持:交集、差集、并集
  

  
差集运算:
  
127.0.0.1:6379[1]> SDIFF jihe1 jihe2
  
1) "a"
  
127.0.0.1:6379[1]> SDIFF jihe2 jihe1
  
1) "d"
  

  
交集运算:
  
127.0.0.1:6379[1]> SINTER jihe1 jihe2
  
1) "c"
  
2) "b"
  

  
交集可以设置多个:在添加一个jihe3
  
127.0.0.1:6379[1]> SADD jihe3 d e f
  
(integer) 3
  

  
127.0.0.1:6379[1]> SINTER jihe1 jihe2 jihe3
  
(empty list or set)
  
#这个是因为他是jihe1和jihe2先做交集运算,然后在和jihe3做交集运算
  

  
并集运算
  
127.0.0.1:6379[1]> SUNION jihe1 jihe2
  
1) "c"
  
2) "d"
  
3) "a"
  
4) "b"
  
#同样key设置多个
  
127.0.0.1:6379[1]> SUNION jihe1 jihe2 jihe3
  
1) "c"
  
2) "f"
  
3) "b"
  
4) "a"
  
5) "e"
  
6) "d"
  

  
以上的集合是无序的,redis支持有序的集合他的名如下
  
ZADD key score member 增加元素
  
ZSCORE key member 获取元素的分数
  
ZRANGE key start stop [WITHSCORES]
  
ZRANGEBYSCORE key min max
  

  
添加有序集合
  
127.0.0.1:6379> ZSCORE youxu 80 a
  
(integer) 1
  
127.0.0.1:6379> ZADD youxu 81 b
  
(integer) 1
  
可以添加多个
  
127.0.0.1:6379> ZADD youxu 82 c 83 d
  
(integer) 2
  

  
获取分数
  
127.0.0.1:6379[1]> ZSCORE youxu a
  
"80"
  
127.0.0.1:6379[1]> ZSCORE youxu b
  
"81"
  
127.0.0.1:6379[1]> ZSCORE youxu c
  
"82"
  
127.0.0.1:6379[1]> ZSCORE youxu d
  
"83"
  

  
获取有序集合范围
  
127.0.0.1:6379[1]> ZRANGE youxu 0 3  #参考列表集合的0 3  从0到3的元素
  
1) "a"
  
2) "b"
  
3) "c"
  
4) "d"
  

  
在举个例子:
  
127.0.0.1:6379[1]> ZADD youxu 84 e
  
(integer) 1
  
127.0.0.1:6379[1]> ZRANGE youxu 0 4
  
1) "a"
  
2) "b"
  
3) "c"
  
4) "d"
  
5) "e"
  
127.0.0.1:6379[1]> ZADD youxu 79 f
  
(integer) 1
  
127.0.0.1:6379[1]> ZRANGE youxu 0 5
  
1) "f"
  
2) "a"
  
3) "b"
  
4) "c"
  
5) "d"
  
6) "e"
  

  
######f在前面因为他的score小!
  
热门文章,可以用这个来排序,我可以给他设置一个分数!!!!!



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-631031-1-1.html 上篇帖子: 互联网架构设计之Redis篇-【Redis Windows版本安装过程】 下篇帖子: 【php-redis】pub/sub 公开和订阅
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表