Redis学习记录(一)--入门知识

Redis学习记录(一)–入门知识

标签(空格分隔): javaWEB

Redis是一个开源的,先进的key-value存储可用于构建高性能,可扩展的Web应用程序的解决方案.

Redis优点

  • 异常快速:Redis是非常快的,每秒可以执行大约110000设置操作,81000个/每秒的读取操作。
  • 支持丰富的数据类型: Redis支持最大多数开发人员已经知道如列表,集合,可排序集合,哈希等数据类型.
  • 这使得在应用中很容易解决的各种问题,因为我们知道哪些问题处理使用哪种数据类型更好解决
  • 操作都是原子的:所有 Redis的操作都是原子,从而确保当两个客户同时访问Redis服务器得到的是更新后的值(最新值).
  • MultiUtility工具:Redis是一个多功能实用工具,可以在很多如:缓存,消息传递队列中使用(Redis原生支持发布/订阅),在应用程序中,如:Web应用程序会话,网站页面点击数等任何短暂的数据

1.环境配置

1.1下载编译

$ wget http://download.redis.io/releases/redis-3.2.6.tar.gz
$ tar xzf redis-3.2.6.tar.gz
$ cd redis-3.2.6
$ make

这里有的坑:

1.你的linux要装gcc编译器,不然会编译失败,centos下安装命令为:

yum install gcc-c++

2.安装后还编译失败,提示No such file or directory之类的,解决办法,替换make命令如下

make MALLOC=libc

官方解释:

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

1.2启动

编译后生成src目录.进入后执行

./redist-server

或者指定配置文件

./redis-server redis.conf

则可以看到启动日志.

这里会有三个WARN:

11980:M 08 Dec 11:30:51.347 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
11980:M 08 Dec 11:30:51.347 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
11980:M 08 Dec 11:30:51.347 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

按照提示分别修复:

1.第一个提示somaxconn这个值为128太小了,这个值是系统的网络连接队列大小,而redis的TCP backlog设置的值为511,因此受限,所以修改下系统的值

$ vim /etc/sysctl.conf
$ net.core.somaxconn = 20480  #最大队列长度,应付突发的大并发连接请求,默认为128
$ net.ipv4.tcp_max_syn_backlog = 20480  #半连接队列长度,此值受限于内存大小,默认为1024
$ sysctl -p  #使参数生效

2.overcommit_memory设置为0,在低内存条件下可能会保存失败,修复方法是在sysctl.conf下添加vm.overcommit_memory = 1

vm.overcommit_memory不同的值说明:
0 表示检查是否有足够的内存可用,如果是,允许分配;如果内存不够,拒绝该请求,并返回一个错误给应用程序。
1 允许分配超出物理内存加上交换内存的请求
2 内核总是返回true
redis的数据回写机制分为两种
同步回写即SAVE命令。redis主进程直接写数据到磁盘。当数据量大时,这个命令将阻塞,响应时间长
异步回写即BGSAVE命令。redis 主进程fork一个子进程,复制主进程的内存并通过子进程回写数据到磁盘。
由于RDB文件写的时候fork一个子进程。相当于复制了一个内存镜像。当时系统的内存是4G,而redis占用了
近3G的内存,因此肯定会报内存无法分配。如果 「vm.overcommit_memory」设置为0,在可用内存不足的情况
下,就无法分配新的内存。如果 「vm.overcommit_memory」设置为1。 那么redis将使用交换内存。

修改方案:

$ vim /etc/sysctl.conf
$ vm.overcommit_memory = 1  
$ sysctl -p  #使参数生效

3.关闭THP透明内存

`Transparent Huge Pages (THP)`告警,这是一个关于透明内存巨页的话题。简单来说内存可管理的最小
单位是page,一个page通常是4kb,那1M内存就会有256个page,CPU通过内置的内存管理单元管理page表
记录。Huge Pages就是表示page的大小已超过4kb了,一般是2M到1G,它的出现主要是为了管理超大内存。
个人理解上TB的内存。而THP就是管理Huge Pages的一个抽象层次,根据一些资料显示THP会导致内存锁
影响性能,所以一般建议关闭此功能。
   “/sys/kernel/mm/transparent_hugepage/enabled”有三个值,如下:
  $ cat /sys/kernel/mm/transparent_hugepage/enabled
    always [madvise] never
    ####
    # always 尽量使用透明内存,扫描内存,有512个 4k页面可以整合,就整合成一个2M的页面
    # never 关闭,不使用透明内存
    # madvise 避免改变内存占用

修改方法:

$ vim /etc/rc.local
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled  #在开机脚本里追加此命令

再启动,则不报错了

1.3测试

再开个终端,然后执行如下命令,其中redis-cli是客户端程序,命令是利用该程序与服务器交互.具体指令形式:

 redis-cli -h host -p port -a password

不加参数,默认连接本地.

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

原样输出则没问题,到此环境安装完毕.

1.4配置

redis.conf是redis的默认配置,可以直接修改文件或者使用命令来修改配置.

获取配置命令:CONFIG GET CONFIG_SETTING_NAME
当使用*则获取全部配置

修改配置命令:CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

关于配置的说明可以参考菜鸟教程的redis教程

2.数据类型

2.1 String(字符串)

string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value.
string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象.
string类型是Redis最基本的数据类型,一个键最大能存储512MB.

示例:

redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"

2.2 Hash(哈希)

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

示例:

127.0.0.1:6379> HMSET user:1 username runoob password runoob points 200
OK
127.0.0.1:6379> HGETALL user:1
1) "username"
2) "runoob"
3) "password"
4) "runoob"

2.3 List(列表)

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

示例:

redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"

2.4 Set(集合)

Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
sadd 命令
添加一个string元素到,key对应的set集合中,成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误。

示例:

redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob

1) "rabitmq"
2) "mongodb"
3) "redis"

2.5 zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zadd 命令
添加元素到集合,元素在集合中存在则更新对应score

示例:

redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 1000

1) "redis"
2) "mongodb"
3) "rabitmq"

3.redis命令

3.1.redisKey命令

http://www.runoob.com/redis/redis-keys.html

3.2.redis字符串命令

http://www.runoob.com/redis/redis-strings.html

3.3.redis哈希命令

http://www.runoob.com/redis/redis-hashes.html

3.4.redis列表命令

http://www.runoob.com/redis/redis-lists.html

3.5.redis集合命令

http://www.runoob.com/redis/redis-sets.html

3.6.redis有序集合命令

http://www.runoob.com/redis/redis-sorted-sets.html

更多基础使用可以参考菜鸟教程,个人感觉写的很不错,下一篇学习在Java中使用redis.

参考代码:

https://github.com/nl101531/JavaWEB 下Util-Demo

参考链接:

本文从该博客学习总结而得

https://muyinchen.github.io
    原文作者:此博废弃_更新在个人博客
    原文地址: https://www.jianshu.com/p/da69edda2a43
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞