• Stars
    star
    380
  • Rank 112,766 (Top 3 %)
  • Language
    Crystal
  • License
    MIT License
  • Created over 9 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Full featured Redis client for Crystal

Redis Client for Crystal

Build Status PRs Welcome

A Redis client for the Crystal programming language.

Features

  • Performance (> 680,000 commands per second using pipeline on a MacBook Air with a single client thread)
  • Pipelining
  • Transactions
  • LUA Scripting
  • All string commands
  • All hash commands
  • All list commands
  • All set commands
  • All hyperloglog commands
  • All commands for bit operations
  • All sorted set commands
  • All geo commands
  • Publish/subscribe

Installation

Add it to your shard.yml:

dependencies:
  redis:
    github: stefanwille/crystal-redis

and then install the library into your project:

$ shards install

Installation on MacOS X

On MacOS X you may get this error:

ld: library not found for -lssl (this usually means you need to install the development package for libssl)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
...

Or this warning:

Package libssl was not found in the pkg-config search path.
Perhaps you should add the directory containing `libssl.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libssl' found
Package libcrypto was not found in the pkg-config search path.
Perhaps you should add the directory containing `libcrypto.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libcrypto' found

The problem is that Crystal can't find openssl, because it is not installed by default on MacOS X.

The fix:

  1. Install openssl via Homebrew:
$ brew install openssl
  1. Set the environment variable PKG_CONFIG_PATH:
$ export PKG_CONFIG_PATH=/usr/local/opt/openssl/lib/pkgconfig

Note: Please write me if you know a better way!

Required Crystal Version

This library needs Crystal version >= 0.34.0

I haven't tested older Crystal versions.

Usage

Require the package:

  require "redis"

then

  redis = Redis.new

Then you can call Redis commands on the redis object:

  redis.set("foo", "bar")
  redis.get("foo")

Connection Pooling

Since version 2.0.0, a connection pool is built in. It is used implicitly through Redis::PooledClient:

redis = Redis::PooledClient.new
10.times do |i|
  spawn do
    redis.set("foo#{i}", "bar")
    redis.get("foo#{i}") # => "bar"
  end
end

This redis instance can be shared across fibers, and accepts the same Redis commands as the Redis class. It automatically allocates and frees connections from/to the pool, per command.

⚠️ If you are using Redis in a web context (e. g. with a framework like Kemal), you need to use connection pooling.

Examples

To get started, see the examples:

Documentation

Performance

I have benchmarked Crystal-Redis against several other client libraries in various programming languages in this blog article.

Here are some results:

  • Crystal: With this library I get > 680,000 commands per second using pipeline on a MacBook Air with a single client thread.

  • C: The equivalent program written in C with Hiredis gets me 340,000 commands per second.

  • Ruby: Ruby 2.2.1 with the redis-rb and Hiredis driver handles 150,000 commands per second.

Read more results for Go, Java, Node.js.

Status

I have exercised every API method in the spec and built some example programs. Some people report production usage.

I took great care to make this library very usable with respect to API, reliability and documentation.

Development

This project requires a locally running redis server running on port 6379 and with a Unix socket located at /tmp/redis.sock. In Homebrew's default redis.config the Unix domain socket option is disabled. To enable, edit /usr/local/etc/redis.conf or whatever your redis.conf is and uncomment this line:

# unixsocket /tmp/redis.sock

so that it reads

unixsocket /tmp/redis.sock

Then you can run the specs via

$ crystal spec

See more information.

WARNING

Running the spec will delete database number 0!

Questions, Bugs & Support

If you have questions or need help, please open a ticket in the GitHub issue tracker. This way others can benefit from the discussion.

More Repositories

1

git-branch-delete

Interactive command line tool that makes it comfortable to delete several Git branches at once.
JavaScript
69
star
2

pacman-react

A Pac Man game, built with React, TypeScript, MobX, styled-components, and Xstate
TypeScript
45
star
3

blueprintjs-with-react

My first steps with Blueprint.js, a React component library
JavaScript
33
star
4

redis-client-benchmarks

A benchmark for Redis client libraries in various programming languages.
JavaScript
28
star
5

nodejs-integration-testing

Integration testing of a Node.js / Express.js / Sequelize app
JavaScript
26
star
6

openapi-generator-typescript-example

TypeScript
17
star
7

crystal-redis-examples

Examples for crystal-redis
Crystal
9
star
8

crowd_rails

Single sign on with Atlassian Crowd 2.0 for Ruby on Rails (unmaintained)
Ruby
6
star
9

graphql-apollo-react-demo

A demo GraphQL client with Apollo and React.js
JavaScript
4
star
10

react-todo

Todo App in React.js / Redux / ES6
JavaScript
2
star
11

scheme-interpreter

Scheme interpreter in ReasonML, based on SICP chapter 4
Reason
2
star
12

crowd_rails_test

Demo and test for the crowd_rails gem
Ruby
2
star
13

colearningday-website

Source Code for colearn.io
1
star
14

redis-in-go

An exercise in Go programming: A minimal Redis reimplementation
Go
1
star
15

crystal-lightning-talk

Crystal
1
star
16

exercism-go

Go
1
star
17

common-algorithms

TypeScript
1
star
18

graphql-apollo-typescript-demo

A demo GraphQL server with Apollo and TypeScript
TypeScript
1
star
19

loggingproxy

Logging TCP proxy. Forwards clients connections to a server and logs all packets on the console.
Java
1
star
20

gitrss

RSS feed for git commits.
Ruby
1
star
21

react-tictactoe

React.js / Redux / ES5 Demo with the game Tic Tac Toe
JavaScript
1
star
22

combinations-and-permutations

TypeScript
1
star
23

chat-react-material-ui-node

A chat based on React.js, Material-UI, Socket.io, Express and Node.js
JavaScript
1
star